现在使用jboss的resteasy 做一个rest接口,用于接收上传的文件。
先前是类似这么用的:
@POST@Path("/uploadfile")@Consumes("multipart/form-data")public Response uploadFile(@Context HttpServletRequest request) {File f = new File("c:\\XXXXX.exe");InputStream is = null;try {is = request.getInputStream();FileUtils.copyInputStreamToFile(is, f);} catch (IOException e) {<span style="white-space:pre"> </span>e.printStackTrace();}return Response.ok().build();}
发现上传后文件被破坏掉了,图片打不开、执行文件无法执行。这个不知道为什么?有朋友知道可以告诉一下。
后来上网搜了下,就改用了MultipartFormDataInput方式,结果就OK了:
用法大概如下:
@POST@Path("/upload")@Consumes("multipart/form-data")public Object uploadfile(MultipartFormDataInput input) {Map<String, Object> map = null;Map<String, List<InputPart>> uploadForm = input.getFormDataMap();//取得文件表单名List<InputPart> inputParts = uploadForm.get("kfile");for (InputPart inputPart : inputParts) {try {InputStream inputStream = inputPart.getBody(InputStream.class,null);//TODO 把文件流保存;} catch (IOException e) {e.printStackTrace();}}return Response.ok().build();
}
以此为记。
===============
后记
以上两种方式的差异跟HTTP协议有关
使用request.getInputStream()的话是获取整个POST BODY内容,但这个BODY内容可能包含参数与文件信息,这里就不等于上传的文件了。
使用MultipartFormDataInput的话,可以从POST BODY分离出参数和文件对象,所以可以通过uploadForm.get("kfile")的方式获取指定文件对象。