apache.commons.fileupload 抛出 MalformedStreamException

发布于 2024-10-07 17:38:27 字数 2455 浏览 0 评论 0原文

我有这段代码(我没有写,只是维护):

public class MyMultipartResolver extends CommonsMultipartResolver{    
  public List parseEmptyRequest(HttpServletRequest request) throws IOException, FileUploadException {
            String contentType = request.getHeader(CONTENT_TYPE);
            int boundaryIndex = contentType.indexOf("boundary=");

            InputStream input = request.getInputStream();

            byte[] boundary = contentType.substring(boundaryIndex + 9).getBytes();
            MultipartStream multi = new MultipartStream(input, boundary);
            multi.setHeaderEncoding(getHeaderEncoding());

            ArrayList items = new ArrayList();
            boolean nextPart = multi.skipPreamble();
            while (nextPart) {
                Map headers = parseHeaders(multi.readHeaders());
               // String fieldName = getFieldName(headers);

                String subContentType = getHeader(headers, CONTENT_TYPE);
                if (subContentType == null) {
                    FileItem item = createItem(headers, true);
                    OutputStream os = item.getOutputStream();
                    try {
                        multi.readBodyData(os);
                    } finally {
                        os.close();
                    }
                    items.add(item);
                } else {
                    multi.discardBodyData();
                }

                nextPart = multi.readBoundary();
            }

            return items;
        }
}

我正在使用 commons-fileupload.jar 版本 1.2.1 ,显然代码正在使用一些已弃用的方法...
无论如何,在尝试使用此代码上传一个非常大的文件(780 MB)时,我得到了这个:

org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
    at java.io.InputStream.read(InputStream.java:89)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
    at org.apache.commons.fileupload.MultipartStream.readBodyData(MultipartStream.java:593)
    at org.apache.commons.fileupload.MultipartStream.discardBodyData(MultipartStream.java:619)

这是从 'multi.discardBodyData();' 抛出的线。
我的问题: 如何避免此错误并能够成功收集 FileItems?

I have got this piece of code (I didn't write, just maintaining):

public class MyMultipartResolver extends CommonsMultipartResolver{    
  public List parseEmptyRequest(HttpServletRequest request) throws IOException, FileUploadException {
            String contentType = request.getHeader(CONTENT_TYPE);
            int boundaryIndex = contentType.indexOf("boundary=");

            InputStream input = request.getInputStream();

            byte[] boundary = contentType.substring(boundaryIndex + 9).getBytes();
            MultipartStream multi = new MultipartStream(input, boundary);
            multi.setHeaderEncoding(getHeaderEncoding());

            ArrayList items = new ArrayList();
            boolean nextPart = multi.skipPreamble();
            while (nextPart) {
                Map headers = parseHeaders(multi.readHeaders());
               // String fieldName = getFieldName(headers);

                String subContentType = getHeader(headers, CONTENT_TYPE);
                if (subContentType == null) {
                    FileItem item = createItem(headers, true);
                    OutputStream os = item.getOutputStream();
                    try {
                        multi.readBodyData(os);
                    } finally {
                        os.close();
                    }
                    items.add(item);
                } else {
                    multi.discardBodyData();
                }

                nextPart = multi.readBoundary();
            }

            return items;
        }
}

I am using commons-fileupload.jar version 1.2.1 and obviously the code is using some deprecated methods...
Anyway, while trying to use this code to upload a very large file (780 MB) I get this:

org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
    at java.io.InputStream.read(InputStream.java:89)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
    at org.apache.commons.fileupload.MultipartStream.readBodyData(MultipartStream.java:593)
    at org.apache.commons.fileupload.MultipartStream.discardBodyData(MultipartStream.java:619)

that is thrown from 'multi.discardBodyData();' line.
My question:
How can I avoid this error and be able to be able to succeed collecting the FileItems?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼泪都笑了 2024-10-14 17:38:27

catch

(org.apache.commons.fileupload.MultipartStream.MalformedStreamException e)
        {

            e.printStackTrace();

            return ERROR;
        }

捕获异常并通过 InputStreamReturn Error 处理它 在 struts 操作标记中使用它

catch

(org.apache.commons.fileupload.MultipartStream.MalformedStreamException e)
        {

            e.printStackTrace();

            return ERROR;
        }

Catch the exception and handle it via ..either InputStream or Return Error use it in struts action tag

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文