我正在尝试用Java完全实现可恢复的文件上传系统。我使用的库是resumable.js,它发送一个文件块保存为.part
,然后在最后将它们合并在一起。当我收到POST
请求时,在我的doPost
方法中,我接受请求,将其保存到HttpServletRequestWrapper
,然后使用它来获取我需要的所有数据。但是,将文件保存为.part
时,我最终将它们设置为空并且大小为0字节。
我已经检查过,似乎数据全部存在,但我似乎无法获取要保存的数据。有没有我错误实施的东西?
以下是我用来执行此任务的一小段代码:
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
HttpServletRequestWrapper wrapReq = new HttpServletRequestWrapper(request);
BufferedReader reader = wrapReq.getReader();
/**
* Get some data from the BufferedReader
*/
if(ServletFileUpload.isMultipartContent(wrapReq)){
File mkd = new File(temp_dir);
if(!mkd.isDirectory())
mkd.mkdirs();
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
Iterator<FileItem> iter = upload.parseRequest(request).iterator();
OutputStream out;
out = new FileOutputStream(new File(dest_dir));
while(iter.hasNext()){
try {
FileItem item = iter.next();
IOUtils.copy(item.getInputStream(), out);
logger.debug("Wrote file " + resumableIdentifier + " with chunk number "
+ resumableChunkNumber + " to " + temp_dir);
out.close();
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
}
}
tryCreateFileFromChunks(temp_dir, resumableFileName, resumableChunkSize, resumableTotalSize);
} catch (Exception e) {
e.printStackTrace();
}
}
tryCreateFileFromChunks()
方法只是检查所有部分是否存在并合并它们。这不是问题。 .part
文件本身存储为空。
那么,我是否以错误的方式处理了这个问题?我一直在努力让这个工作正常。
答案 0 :(得分:2)
您不应该使用HttpServletRequestWrapper
,也不应该调用getReader()
。请求正文只能读取一次,您必须选择是使用getReader()
方法,或 getInputStream()
方法,还是 {{1在同一个请求上的方法,而不是混合它们。
Apache Commons FileUpload使用内部getParameterXxx()
来解析请求正文。但如果您事先调用了getInputStream()
或getReader()
,那么Apache Commons FileUpload将获得一个空的请求体。
总而言之,要解决问题,只需完全摆脱getParameterXxx()
。
wrapReq