2016-05-26 106 views
0

我正在開發一個使用RESTEasy的休息服務,該服務的目標是從POST請求獲取文本文件並解析它。我已經在兩個方面做到了:使用POST請求發送文件到REST服務

@Path("/HTTPRequestWay") 
@POST 
@Produces(MediaType.TEXT_PLAIN) 
public String uploadFile2(
     @HeaderParam("sourceSystem")String sourceSystem, 
     @HeaderParam("payloadType")String payloadType, 
     @Context HttpServletRequest request){ 

    String payloadHTTP = ""; 
    try { 
     payloadHTTP = getBody(request); 
    }catch (IOException e){ 
     e.printStackTrace(); 
     payloadHTTP = "error"; 
    } 

    return payloadHTTP; 
} 

@Path("/InputStreamWay") 
@POST 
@Produces(MediaType.TEXT_PLAIN) 
public String uploadFile2(
     @HeaderParam("sourceSystem")String sourceSystem, 
     @HeaderParam("payloadType")String payloadType, 
     InputStream payload){ 

    String payloadInputStream = "none"; 
    try { 
     payloadInputStream = IOUtils.toString(payload, "UTF-8"); 
    }catch (IOException e){ 
     e.printStackTrace(); 
     payloadInputStream = "error"; 
    } 
    finally{ 
     IOUtils.closeQuietly(payload); 
    } 

    return payloadInputStream ; 
} 

public static String getBody(HttpServletRequest request) throws IOException { 

    String body = null; 
    StringBuilder stringBuilder = new StringBuilder(); 
    BufferedReader bufferedReader = null; 

    try { 
     InputStream inputStream = request.getInputStream(); 
     if (inputStream != null) { 
      bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      char[] charBuffer = new char[128]; 
      int bytesRead = -1; 
      while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
       stringBuilder.append(charBuffer, 0, bytesRead); 
      } 
     } else { 
      stringBuilder.append(""); 
     } 
    } catch (IOException ex) { 
     throw ex; 
    } finally { 
     if (bufferedReader != null) { 
      try { 
       bufferedReader.close(); 
      } catch (IOException ex) { 
       throw ex; 
      } 
     } 
    } 

    body = stringBuilder.toString(); 
    return body; 
} 

我試圖解析文件或者與HttpServletRequest的(讓身體),或將一個參數的方法(InputStream的)。我的疑問是關於這第二種情況下,爲什麼我的方法可以轉換我在參數(InputStream有效載荷)發送的文件? 它對我來說看起來很神奇,爲什麼它會以第二種方式工作,哪個更好?謝謝

+0

檢查http://stackoverflow.com/questions/24890675/file-upload-using-rest-api-in-java –

回答

1

這不是魔術,它只是從HttpServletRequest注入InputStream。在docs處獲得戰利品。

Resteasy可以自動編組和解組幾個不同的消息體。

其中之一是java.io.InputStream

+0

謝謝我明白了。我做了一些嘗試發送文本文件,也沒有發送發送文件,但包括在本體中的文件包含的數據作爲原始的,在這兩種情況下,我正確接收它,所以我的問題是我怎麼能知道我的REST服務,如果數據該文件是否已經發送,或者如果只是請求中的原始類型? – DarkAngeL

+0

您可以使用'@ Consumes'註釋,並且只處理多部分數據。 – meskobalazs