解决commons-fileupload组件无法处理自定义head信息的bug
2010-02-25 22:35
465 查看
解决commons-fileupload组件无法处理自定义head信息的bug
相关阅读:
1. 对commons fileupload组件的简单封装
2. 利用Jakarta commons fileupload组件实现多文件上传
3. 巧妙使用spring对commons fileUpload的包装
Jakarta commons fileupload组件可以处理HTTP请求及响应,很多时候被用来处理文件上传,但是近期发现,当我们自定义文件上传、自己组装mime信息、文件上传时加入自定义head节点时,fileupload组件无法获得自定义的head节点,仔细分析了fileupload组件源代码后,发现核心方法在FileUploadBase文件的findNextItem方法中,问题在于fileupload组件解析完自定义的head节点后,却忘记传递到FileItemStreamImpl中了,稍作修订,即可修正该bug。
相关阅读:
1. 对commons fileupload组件的简单封装
2. 利用Jakarta commons fileupload组件实现多文件上传
3. 巧妙使用spring对commons fileUpload的包装
Jakarta commons fileupload组件可以处理HTTP请求及响应,很多时候被用来处理文件上传,但是近期发现,当我们自定义文件上传、自己组装mime信息、文件上传时加入自定义head节点时,fileupload组件无法获得自定义的head节点,仔细分析了fileupload组件源代码后,发现核心方法在FileUploadBase文件的findNextItem方法中,问题在于fileupload组件解析完自定义的head节点后,却忘记传递到FileItemStreamImpl中了,稍作修订,即可修正该bug。
/**解析文件列表 * 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; }
相关文章推荐
- 快速解决commons-fileupload组件无法处理自定义head信息的bug
- 解决commons-fileupload组件无法处理自定义head信息的bug
- jquery-fileupload IE8IE9无法上传图片的BUG及如何给input[type=file]自定义样式
- 解决less的data-uri函数无法处理相对路径的Bug
- 关于EasyUI 1.5版Datagrid组件在空数据时无法显示"空记录"提示的BUG解决方法
- 解决asp.net Sharepoint无法连接发布自定义字符串处理程序,不能进行输出缓存处理的方法
- ajax框架dwr自定义同步异步--解决回调函数中处理无法得到预期结果问题
- sql2008 启动报错:应用程序的组件中发生了无法处理的异常和值不能为空 viewinfo(已解决!)
- 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题
- 【bug日常】数据库表修改列信息但无法保存的解决方法
- 腾讯地图poi关键词检索,点击标注获取坐标位置等信息,无法自定义标注的解决方法
- 插件框架一之解决插件布局自定义组件无法使用问题
- sql2008 启动报错:应用程序的组件中发生了无法处理的异常和值不能为空 viewinfo(已解决!)
- 解决less的data-uri函数无法处理相对路径的Bug
- commons-fileUpload组件解决文件上传乱码问题
- 解决oracle11g安装导致数据库无法自动搜集统计信息
- 解决python3写文件时无法处理中文字符的问题
- 解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题
- Tomcat启动异常,控制台信息无法定位错误的解决方法