2016-05-26 73 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