java - 从 POST 保存分割上传的文件最终会变成空

标签 java http servlets file-upload http-post

我正在尝试用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/

相关文章:

java - RequestDispatcher.forward() 的树

java - ChromeDriver 无法启动

java - 如何在tomcat中跳过http基本身份验证?

c# - 将 WebClient 转换为 HttpClient

HTTP 获取内容类型

java - 复制 HttpServletRequest 并发送到另一台服务器?

java - 当一个字符紧接着另一个字符重复时,数组索引超出范围(Java)

java - 显示反转数字数组

web-services - 处理多级网络请求的正确方法是什么?

java - Primefaces 组件不呈现