源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

快速解决commons-fileupload组件无法处理自定义head信息的bug

  • 时间:2022-04-12 11:32 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:快速解决commons-fileupload组件无法处理自定义head信息的bug
Jakarta commons fileupload组件可以处理HTTP请求及响应,很多时候被用来处理文件上传,但是近期发现,当我们自定义文件上传、自己组装mime信息、文件上传时加入自定义head节点时,fileupload组件无法获得自定义的head节点,仔细分析了fileupload组件源代码后,发现核心方法在FileUploadBase文件的findNextItem方法中,问题在于fileupload组件解析完自定义的head节点后,却忘记传递到FileItemStreamImpl中了,稍作修订,即可修正该bug。
[u]复制代码[/u] 代码如下:
/**解析文件列表          * Called for finding the nex item, if any.          * @return True, if an next item was found, otherwise false.          * @throws IOException An I/O error occurred.          */         private boolean findNextItem() throws IOException {             if (eof) {                 return false;             }             if (currentItem != null) {                 currentItem.close();                 currentItem = null;             }             for (;;) {                 boolean nextPart;                 if (skipPreamble) {                     nextPart = multi.skipPreamble();                 } else {                     nextPart = multi.readBoundary();                 }                 if (!nextPart) {                     if (currentFieldName == null) {                         // Outer multipart terminated -> No more data                         eof = true;                         return false;                     }                     // Inner multipart terminated -> Return to parsing the outer                     multi.setBoundary(boundary);                     currentFieldName = null;                     continue;                 }                 FileItemHeaders headers = getParsedHeaders(multi.readHeaders());                 if (currentFieldName == null) {                     // We're parsing the outer multipart                     String fieldName = getFieldName(headers);                     if (fieldName != null) {                         String subContentType = headers.getHeader(CONTENT_TYPE);                         if (subContentType != null                                 &&  subContentType.toLowerCase()                                         .startsWith(MULTIPART_MIXED)) {                             currentFieldName = fieldName;                             // Multiple files associated with this field name                             byte[] subBoundary = getBoundary(subContentType);                             multi.setBoundary(subBoundary);                             skipPreamble = true;                             continue;                         }                         String fileName = getFileName(headers);                         currentItem = new FileItemStreamImpl(fileName,                                 fieldName, headers.getHeader(CONTENT_TYPE),                                 fileName == null, getContentLength(headers));                         notifier.noteItem();                         itemValid = true;                         return true;                     }                 } else {                     String fileName = getFileName(headers);                     if (fileName != null) {                              //这里代码要修订                         //这是原来的代码,没有传入header                         //currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers));                         //这是新的代码,我们要传入header                         currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers),headers);                         notifier.noteItem();                         itemValid = true;                         return true;                     }                 }                 multi.discardBodyData();             }         }               /**原始代码,存在丢失FileItemHeaders信息的bug              * Creates a new instance.              * @param pName The items file name, or null.              * @param pFieldName The items field name.              * @param pContentType The items content type, or null.              * @param pFormField Whether the item is a form field.              * @param pContentLength The items content length, if known, or -1              * @throws IOException Creating the file item failed.              */             FileItemStreamImpl(String pName, String pFieldName,                     String pContentType, boolean pFormField,                     long pContentLength) throws IOException {                 name = pName;                 fieldName = pFieldName;                 contentType = pContentType;                 formField = pFormField;                 final ItemInputStream itemStream = multi.newInputStream();                 InputStream istream = itemStream;                 if (fileSizeMax != -1) {                     if (pContentLength != -1                             &&  pContentLength > fileSizeMax) {                         FileUploadException e =                             new FileSizeLimitExceededException(                                 "The field " + fieldName                                 + " exceeds its maximum permitted "                                 + " size of " + fileSizeMax                                 + " characters.",                                 pContentLength, fileSizeMax);                         throw new FileUploadIOException(e);                     }                     istream = new LimitedInputStream(istream, fileSizeMax) {                         protected void raiseError(long pSizeMax, long pCount)                                 throws IOException {                             itemStream.close(true);                             FileUploadException e =                                 new FileSizeLimitExceededException(                                     "The field " + fieldName                                     + " exceeds its maximum permitted "                                     + " size of " + pSizeMax                                     + " characters.",                                     pCount, pSizeMax);                             throw new FileUploadIOException(e);                         }                     };                 }                 stream = istream;             }               /**创建FileItem,修订后的代码,解决丢失FileItemHeaders信息的bug              * @param pName              * @param pFieldName              * @param pContentType              * @param pFormField              * @param pContentLength              * @param headers              * @throws IOException              */             FileItemStreamImpl(String pName, String pFieldName,                     String pContentType, boolean pFormField,                     long pContentLength,FileItemHeaders headers) throws IOException {                 name = pName;                 fieldName = pFieldName;                 contentType = pContentType;                 formField = pFormField;                 if(headers!=null){                         this.headers = headers;                 }                 final ItemInputStream itemStream = multi.newInputStream();                 InputStream istream = itemStream;                 if (fileSizeMax != -1) {                     if (pContentLength != -1                             &&  pContentLength > fileSizeMax) {                         FileUploadException e =                             new FileSizeLimitExceededException(                                 "The field " + fieldName                                 + " exceeds its maximum permitted "                                 + " size of " + fileSizeMax                                 + " characters.",                                 pContentLength, fileSizeMax);                         throw new FileUploadIOException(e);                     }                     istream = new LimitedInputStream(istream, fileSizeMax) {                         protected void raiseError(long pSizeMax, long pCount)                                 throws IOException {                             itemStream.close(true);                             FileUploadException e =                                 new FileSizeLimitExceededException(                                     "The field " + fieldName                                     + " exceeds its maximum permitted "                                     + " size of " + pSizeMax                                     + " characters.",                                     pCount, pSizeMax);                             throw new FileUploadIOException(e);                         }                     };                 }                 stream = istream;             }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部