ジャカルタ・コモンズfileupload コンポーネントは HTTP リクエストと応答を処理できますが、ファイルのアップロードをカスタマイズしたり、MIME 情報を自分で組み立てたり、ファイルをアップロードするときにカスタム ヘッド ノードを追加したりする場合には、fileupload コンポーネントを使用できないことが最近わかりました。ファイルのヘッド ノードは慎重に分析されます。コンポーネントのソース コードをロードした後、コア メソッドが FileUploadBase ファイルの findNextItem メソッドにあることがわかりました。問題は、fileupload コンポーネントがカスタム ヘッド ノードを解析した後、それを FileItemStreamImpl に渡すのを忘れていたことです。リビジョンアップすると、このバグは修正される可能性があります。
次のようにコードをコピーします。
/**ファイルリストを解析する
* 次の項目がある場合は、それを見つけるために呼び出されます。
* @return 次の項目が見つかった場合は true、それ以外の場合は false。
* @throws IOException I/O エラーが発生しました。
*/
private boolean findNextItem() が IOException をスローする {
if (eof) {
false を返します。
}
if (currentItem != null) {
currentItem.close();
現在の項目 = null;
}
のために (;;) {
ブール値 nextPart;
if (スキッププリアンブル) {
nextPart = multi.skipPreamble();
} それ以外 {
nextPart = multi.readBoundary();
}
if (!nextPart) {
if (currentFieldName == null) {
// 外側のマルチパートが終了しました -> これ以上データはありません
eof = true;
false を返します。
}
// 内部のマルチパートが終了しました -> 外部の解析に戻ります
multi.setBoundary(境界);
現在のフィールド名 = null;
続く;
}
FileItemHeaders ヘッダー = getParsedHeaders(multi.readHeaders());
if (currentFieldName == null) {
// 外側のマルチパートを解析しています
文字列フィールド名 = getフィールド名(ヘッダー);
if (フィールド名 != null) {
文字列 subContentType = headers.getHeader(CONTENT_TYPE);
if (subContentType != null
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
現在のフィールド名 = フィールド名;
// このフィールド名に関連付けられた複数のファイル
byte[] subBoundary = getBoundary(subContentType);
multi.setBoundary(subBoundary);
スキッププリアンブル = true;
続く;
}
文字列ファイル名 = getFileName(headers);
currentItem = new FileItemStreamImpl(ファイル名,
フィールド名、headers.getHeader(CONTENT_TYPE)、
fileName == null, getContentLength(headers));
notifier.noteItem();
itemValid = true;
true を返します。
}
} それ以外 {
文字列ファイル名 = getFileName(headers);
if (ファイル名 != null) {
// ここのコードは修正する必要があります
// これは元のコードです。ヘッダーは渡されません。
//currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers));
//これは新しいコードなので、ヘッダーに渡す必要があります
currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers),headers);
notifier.noteItem();
itemValid = true;
true を返します。
}
}
multi.discardBodyData();
}
}
/**元のコードには FileItemHeaders 情報が失われるバグがあります
* 新しいインスタンスを作成します。
* @param pName アイテムのファイル名、または null。
* @param pFieldName アイテムのフィールド名。
* @param pContentType 項目のコンテンツ タイプ、または null。
* @param pFormField 項目がフォームフィールドかどうか。
* @param pContentLength アイテムのコンテンツの長さ (既知の場合)、または -1
* @throws IOException ファイル項目の作成に失敗しました。
*/
FileItemStreamImpl(String pName, String pFieldName,
文字列 pContentType、ブール値 pFormField、
long pContentLength) が IOException をスローする {
名前 = pName;
フィールド名 = pフィールド名;
contentType = pContentType;
フォームフィールド = pフォームフィールド;
最終的なItemInputStream itemStream = multi.newInputStream();
入力ストリーム istream = itemStream;
if (fileSizeMax != -1) {
if (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
new FileSizeLimitExceededException(
「フィールド」 + フィールド名
+ " 許容される最大値を超えています "
+ " のサイズ " + fileSizeMax
+ " 文字。"、
pContentLength、fileSizeMax);
新しい FileUploadIOException(e) をスローします。
}
istream = 新しい LimitedInputStream(istream, fileSizeMax) {
protected void raiseError(long pSizeMax, long pCount)
IOException をスローします {
itemStream.close(true);
FileUploadException e =
new FileSizeLimitExceededException(
「フィールド」 + フィールド名
+ " 許容される最大値を超えています "
+ " のサイズ " + pSizeMax
+ " 文字。"、
pCount、pSizeMax);
新しい FileUploadIOException(e) をスローします。
}
};
}
ストリーム = istream;
}
/** FileItem を作成し、コードを修正し、FileItemHeaders 情報が失われるバグを解決します。
* @param pName
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* @paramヘッダー
* @throwsIOException
*/
FileItemStreamImpl(String pName, String pFieldName,
文字列 pContentType、ブール値 pFormField、
長い pContentLength、FileItemHeaders ヘッダー)スロー IOException {
名前 = pName;
フィールド名 = pフィールド名;
contentType = pContentType;
フォームフィールド = pフォームフィールド;
if(ヘッダー!=null){
this.headers = ヘッダー;
}
最終的なItemInputStream itemStream = multi.newInputStream();
入力ストリーム istream = itemStream;
if (fileSizeMax != -1) {
if (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
new FileSizeLimitExceededException(
「フィールド」 + フィールド名
+ " 許容される最大値を超えています "
+ " のサイズ " + fileSizeMax
+ " 文字。"、
pContentLength、fileSizeMax);
新しい FileUploadIOException(e) をスローします。
}
istream = 新しい LimitedInputStream(istream, fileSizeMax) {
protected void raiseError(long pSizeMax, long pCount)
IOException をスローします {
itemStream.close(true);
FileUploadException e =
new FileSizeLimitExceededException(
「フィールド」 + フィールド名
+ " 許容される最大値を超えています "
+ " のサイズ " + pSizeMax
+ " 文字。"、
pCount、pSizeMax);
新しい FileUploadIOException(e) をスローします。
}
};
}
ストリーム = istream;
}