0

我正在尝试用 Java 完全实现可恢复的文件上传系统。我正在使用的库是 resumable.js,它发送文件块以另存为.part,然后在最后将它们合并在一起。当我收到POST请求时,我会在我的doPost方法中接受请求,将其保存到 aHttpServletRequestWrapper中,然后使用它来获取我需要的所有数据。但是,当.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文件本身存储为空。

那么,我是否以错误的方式处理了这个问题?我一直在努力让它正常工作。

4

1 回答 1

2

你不应该使用HttpServletRequestWrapper,也不应该调用它getReader()。请求正文只能读取一次,您必须选择是否在同一请求上使用getReader()方法、方法或方法 getInputStream(),而不是混合使用它们。 getParameterXxx()

Apache Commons FileUpload 在内部使用getInputStream()来解析请求正文。但是,如果您已经调用getReader()getParameterXxx()事先调用过,那么 Apache Commons FileUpload 将获得一个空的请求正文。

总而言之,要解决您的问题,请完全摆脱wrapReq

if(ServletFileUpload.isMultipartContent(request)){
    // ...

也可以看看:

于 2013-01-27T20:31:55.063 回答