Компонент fileupload в Jakarta commons может обрабатывать HTTP-запросы и ответы. Однако недавно было обнаружено, что когда мы настраиваем загрузку файлов, сами собираем mime-информацию и добавляем собственные головные узлы при загрузке файлов, компонент fileupload. не может быть получен. После тщательного анализа исходного кода компонента fileupload мы обнаружили, что основной метод находится в методе findNextItem файла FileUploadBase. Проблема в том, что после того, как компонент fileupload проанализировал настроенный головной узел, он забыл его передать. в FileItemStreamImpl. Немного исправьте его, ошибку можно исправить.
Скопируйте код кода следующим образом:
/**Разобрать список файлов
* Вызывается для поиска следующего элемента, если таковой имеется.
* @return True, если был найден следующий элемент, в противном случае — false.
* @throws IOException Произошла ошибка ввода-вывода.
*/
частная логическая функция findNextItem() выдает IOException {
если (еоф) {
вернуть ложь;
}
если (currentItem!= ноль) {
текущийЭлемент.закрыть();
текущийItem = ноль;
}
для (;;) {
логическое значение nextPart;
если (skipPreamble) {
nextPart = multi.skipPreamble();
} еще {
nextPart = multi.readBoundary();
}
если (!nextPart) {
если (currentFieldName == null) {
// Внешний multipart завершен -> данных больше нет
эоф = правда;
вернуть ложь;
}
// Внутренняя составная часть завершена -> Возврат к разбору внешней
multi.setBoundary(граница);
имя текущего поля = ноль;
продолжать;
}
Заголовки FileItemHeaders = getParsedHeaders(multi.readHeaders());
если (currentFieldName == null) {
// Мы анализируем внешний составной элемент
Строковое имя поля = getFieldName (заголовки);
если (имя поля!= ноль) {
Строка subContentType = headers.getHeader(CONTENT_TYPE);
если (subContentType != ноль
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
текущееИмяПоля = ИмяПоля;
// Несколько файлов, связанных с этим именем поля
байт [] subBoundary = getBoundary (subContentType);
multi.setBoundary(подграница);
пропуститьПреамбл = правда;
продолжать;
}
Строка имя_файла = getFileName(заголовки);
currentItem = новый FileItemStreamImpl(имя_файла,
имя поля, headers.getHeader(CONTENT_TYPE),
fileName == null, getContentLength (заголовки));
notifier.noteItem();
ItemValid = Истина;
вернуть истину;
}
} еще {
Строка имя_файла = getFileName(заголовки);
если (имя_файла!= ноль) {
//Код здесь нуждается в доработке
//Это исходный код, заголовок не передается
//currentItem = новый FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers));
//Это новый код, нам нужно передать заголовок
currentItem = новый FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers),headers);
notifier.noteItem();
ItemValid = Истина;
вернуть истину;
}
}
multi.discardBodyData();
}
}
/**Исходный код, есть ошибка потери информации FileItemHeaders.
* Создает новый экземпляр.
* @param pName Имя файла элемента или значение NULL.
* @param pFieldName Имя поля элемента.
* @param pContentType Тип содержимого элемента или значение NULL.
* @param pFormField Является ли элемент полем формы.
* @param pContentLength Длина содержимого элемента, если она известна, или -1.
* @throws IOException Не удалось создать элемент файла.
*/
FileItemStreamImpl (строка pName, строка pFieldName,
Строка pContentType, логическое значение pFormField,
long pContentLength) выдает IOException {
имя = pName;
ИмяПоля = ИмяПоля;
ContentType = pContentType;
formField = pFormField;
окончательный ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
если (fileSizeMax != -1) {
если (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException е =
новое FileSizeLimitExceededException(
«Поле» + имя поля
+ "превышает максимально разрешенный"
+ "размер" + fileSizeMax
+ "символы.",
pContentLength, fileSizeMax);
выдать новое FileUploadIOException(e);
}
istream = новый LimitedInputStream (istream, fileSizeMax) {
protected void raiseError (длинный pSizeMax, длинный pCount)
выдает IOException {
itemStream.close(истина);
FileUploadException е =
новое FileSizeLimitExceededException(
«Поле» + имя поля
+ "превышает максимально разрешенный"
+ "размер" + pSizeMax
+ "символы.",
pCount, pSizeMax);
выдать новое FileUploadIOException(e);
}
};
}
поток = istream;
}
/** Создание FileItem, исправленный код, устранение ошибки потери информации FileItemHeaders
* @param pName
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* Заголовки @param
* @throwsIOException
*/
FileItemStreamImpl (строка pName, строка pFieldName,
Строка pContentType, логическое значение pFormField,
длинные заголовки pContentLength, FileItemHeaders) выдает IOException {
имя = pName;
ИмяПоля = ИмяПоля;
ContentType = pContentType;
formField = pFormField;
если (заголовки! = ноль) {
this.headers = заголовки;
}
окончательный ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
если (fileSizeMax != -1) {
если (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException е =
новое FileSizeLimitExceededException(
«Поле» + имя поля
+ "превышает максимально разрешенный"
+ "размер" + fileSizeMax
+ "символы.",
pContentLength, fileSizeMax);
выдать новое FileUploadIOException(e);
}
istream = новый LimitedInputStream (istream, fileSizeMax) {
protected void raiseError (длинный pSizeMax, длинный pCount)
выдает IOException {
itemStream.close(истина);
FileUploadException е =
новое FileSizeLimitExceededException(
«Поле» + имя поля
+ "превышает максимально разрешенный"
+ "размер" + pSizeMax
+ "символы.",
pCount, pSizeMax);
выдать новое FileUploadIOException(e);
}
};
}
поток = istream;
}