从POST保存拆分上传的文件最后为空

时间:2013-01-27 20:13:15

标签: java http servlets file-upload http-post

我正在尝试用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文件本身存储为空。

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

1 个答案:

答案 0 :(得分:2)

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

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

总而言之,要解决问题,只需完全摆脱getParameterXxx()

wrapReq

另见: