手机
当前位置:查字典教程网 >编程开发 >Java >快速解决commons-fileupload组件无法处理自定义head信息的bug
快速解决commons-fileupload组件无法处理自定义head信息的bug
摘要:Jakartacommonsfileupload组件可以处理HTTP请求及响应,很多时候被用来处理文件上传,但是近期发现,当我们自定义文件上...

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】相关文章:

java中url汉字编码互相转换实例

des加密解密JAVA与.NET互通实例

基于Java注解(Annotation)的自定义注解入门介绍

二进制中1的个数

深入理解java中的synchronized关键字

java final 和instanceof 关键字的区别

通过url方式传递中文乱码的解决方法

java单例模式学习示例

log4j的配置文件详细解析

解决Java调用BAT批处理不弹出cmd窗口的方法分析

精品推荐
分类导航