apache.commons.fileupload создает исключение MalformedStreamException - PullRequest
2 голосов
/ 15 декабря 2010

У меня есть этот кусок кода (я не писал, просто поддерживаю):

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 МБ) я получаю это:

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?

1 Ответ

0 голосов
/ 08 мая 2014

улов

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

            e.printStackTrace();

            return ERROR;
        }

Перехватите исключение и обработайте его с помощью ..ee либо InputStream или Return Error, используйте его в теге действия Struts

...