Komponen fileupload Jakarta commons dapat menangani permintaan dan respons HTTP. Komponen ini sering digunakan untuk menangani upload file. Namun, baru-baru ini ditemukan bahwa ketika kita mengkustomisasi unggahan file, menyusun sendiri informasi mime, dan menambahkan node head khusus saat mengunggah file, komponen fileupload. tidak dapat diperoleh. Setelah menganalisis dengan cermat kode sumber komponen fileupload, kami menemukan bahwa metode intinya ada pada metode findNextItem dari file FileUploadBase. Masalahnya adalah setelah komponen fileupload mengurai node kepala yang disesuaikan, ia lupa meneruskannya ke FileItemStreamImpl. Harap direvisi sedikit, bug dapat diperbaiki.
Copy kode kodenya sebagai berikut:
/**Mengurai daftar file
* Dipanggil untuk mencari item berikutnya, jika ada.
* @return Benar, jika item berikutnya ditemukan, jika tidak, salah.
* @throws IOException Terjadi kesalahan I/O.
*/
boolean pribadi findNextItem() melempar IOException {
jika (eof) {
kembali salah;
}
jika (Item saat ini!= null) {
item saat ini.close();
Item saat ini = null;
}
untuk (;;) {
boolean nextPart;
if (lewati Pembukaan) {
nextPart = multi.skipPembukaan();
} kalau tidak {
nextPart = multi.readBoundary();
}
jika (!Bagian selanjutnya) {
jika (namaFieldsaat ini == null) {
// Multibagian luar dihentikan -> Tidak ada data lagi
eof = benar;
kembali salah;
}
// Multibagian dalam dihentikan -> Kembali ke penguraian bagian luar
multi.setBatas(batas);
NamaField saat ini = null;
melanjutkan;
}
Header FileItemHeaders = getParsedHeaders(multi.readHeaders());
jika (namaFieldsaat ini == null) {
// Kita sedang mengurai multibagian luarnya
String fieldName = getFieldName(header);
jika (Namabidang != null) {
String subContentType = headers.getHeader(CONTENT_TYPE);
jika (subContentType != null
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
NamaField saat ini = NamaField;
// Beberapa file yang terkait dengan nama bidang ini
byte[] subBatas = getBoundary(subContentType);
multi.setBoundary(subBatas);
lewati Pembukaan = benar;
melanjutkan;
}
String namafile = getFileName(header);
Item saat ini = FileItemStreamImpl baru(Namafile,
nama bidang, headers.getHeader(CONTENT_TYPE),
fileName == null, getContentLength(header));
pemberi tahu.noteItem();
itemValid = benar;
kembali benar;
}
} kalau tidak {
String namafile = getFileName(header);
jika (Namafile != null) {
//Kode di sini perlu direvisi
//Ini adalah kode asli, tidak ada header yang diteruskan
//Item saat ini = FileItemStreamImpl baru(Namafile, NamaField saat ini,headers.getHeader(CONTENT_TYPE),false, getContentLength(header));
//Ini adalah kode baru, kita harus meneruskan headernya
currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(header),header);
pemberi tahu.noteItem();
itemValid = benar;
kembali benar;
}
}
multi.buangBodyData();
}
}
/**Kode asli, ada bug hilangnya informasi FileItemHeaders
* Membuat instance baru.
* @param pName Nama file item, atau null.
* @param pFieldName Nama bidang item.
* @param pContentType Tipe konten item, atau null.
* @param pFormField Apakah item tersebut merupakan bidang formulir.
* @param pContentLength Panjang konten item, jika diketahui, atau -1
* @throws IOException Membuat item file gagal.
*/
FileItemStreamImpl(String pNama, String pFieldName,
String pContentType, boolean pFormField,
pContentLength panjang) melempar IOException {
nama = pNama;
namabidang = pNamabidang;
Tipe konten = pTipe Konten;
formField = pFormField;
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
jika (ukuranfilemaks != -1) {
jika (pContentLength != -1
&& pContentLength > ukuranfilemaks) {
FileUploadException e =
FileSizeLimitExceededException baru(
"Bidang" + Namabidang
+ " melebihi batas maksimum yang diijinkan "
+ " ukuran " + fileSizeMax
+ " karakter.",
pContentLength, fileSizeMax);
membuang FileUploadIOException(e);
}
istream = new LimitedInputStream(istream, fileSizeMax) {
void raiseError yang dilindungi (pSizeMax panjang, pCount panjang)
melempar IOException {
itemStream.close(benar);
FileUploadException e =
FileSizeLimitExceededException baru(
"Bidang" + Namabidang
+ " melebihi batas maksimum yang diijinkan "
+ " ukuran " + pSizeMax
+ " karakter.",
pHitung, pSizeMax);
membuang FileUploadIOException(e);
}
};
}
aliran = istream;
}
/** Buat FileItem, kode yang direvisi, selesaikan bug hilangnya informasi FileItemHeaders
* @param pNama
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* @param header
* @throwsIOException
*/
FileItemStreamImpl(String pNama, String pFieldName,
String pContentType, boolean pFormField,
pContentLength panjang, header FileItemHeaders) melempar IOException {
nama = pNama;
namabidang = pNamabidang;
Tipe konten = pTipe Konten;
formField = pFormField;
if(header!=null){
this.headers = header;
}
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
jika (ukuranfilemaks != -1) {
jika (pContentLength != -1
&& pContentLength > ukuranfilemaks) {
FileUploadException e =
FileSizeLimitExceededException baru(
"Bidang" + Namabidang
+ " melebihi batas maksimum yang diijinkan "
+ " ukuran " + fileSizeMax
+ " karakter.",
pContentLength, fileSizeMax);
membuang FileUploadIOException(e);
}
istream = new LimitedInputStream(istream, fileSizeMax) {
void raiseError yang dilindungi (pSizeMax panjang, pCount panjang)
melempar IOException {
itemStream.close(benar);
FileUploadException e =
FileSizeLimitExceededException baru(
"Bidang" + Namabidang
+ " melebihi batas maksimum yang diijinkan "
+ " ukuran " + pSizeMax
+ " karakter.",
pHitung, pSizeMax);
membuang FileUploadIOException(e);
}
};
}
aliran = istream;
}