我正在尝试用Java完全实现一个可断点续传的文件上传系统。我使用的库是 resumable.js ,它发送文件 block 以保存为 .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
文件本身存储为空。
那么,我是否以错误的方式处理了这个问题?我一直在努力让它正常工作。
最佳答案
您不应使用 HttpServletRequestWrapper
,也不应调用其 getReader()
。请求正文只能读取一次,您必须选择是否使用 getReader()
方法、或 getInputStream()
方法、< strong>或 getParameterXxx()
方法在同一个请求上,而不是混合使用它们。
Apache Commons FileUpload 在内部使用 getInputStream()
来解析请求正文。但如果您事先调用了 getReader()
或 getParameterXxx()
,那么 Apache Commons FileUpload 将获得一个空的请求正文。
总而言之,要解决您的问题,只需完全摆脱 wrapReq
即可。
if(ServletFileUpload.isMultipartContent(request)){
// ...
另请参阅:
关于java - 从 POST 保存分割上传的文件最终会变成空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14551723/