ส่วนประกอบการอัปโหลดไฟล์ทั่วไปของจาการ์ตาสามารถจัดการคำขอ HTTP และการตอบกลับได้ มักใช้เพื่อจัดการการอัปโหลดไฟล์ อย่างไรก็ตาม พบว่าเมื่อเร็ว ๆ นี้เมื่อเราปรับแต่งการอัปโหลดไฟล์ รวบรวมข้อมูล mime ด้วยตนเอง และเพิ่มโหนดส่วนหัวที่กำหนดเองเมื่ออัปโหลดไฟล์ ไม่สามารถรับได้ หลังจากวิเคราะห์ซอร์สโค้ดของส่วนประกอบ fileupload อย่างละเอียดแล้ว เราพบว่าวิธีการหลักอยู่ในวิธี findNextItem ของไฟล์ FileUploadBase ปัญหาคือหลังจากที่องค์ประกอบ fileupload แยกวิเคราะห์โหนดหลักที่กำหนดเองแล้ว ก็ลืมส่งผ่าน ไปที่ FileItemStreamImpl โปรดแก้ไขข้อผิดพลาดเล็กน้อย
คัดลอกรหัสรหัส ดังต่อไปนี้:
/**รายการไฟล์แยกวิเคราะห์
* เรียกหารายการต่อไปถ้ามี
* @return True หากพบรายการถัดไป มิฉะนั้นจะเป็นเท็จ
* @throws IOException เกิดข้อผิดพลาด I/O
-
บูลีนส่วนตัว findNextItem() พ่น IOException {
ถ้า (eof) {
กลับเท็จ;
-
ถ้า (รายการปัจจุบัน! = null) {
currentItem.ปิด();
รายการปัจจุบัน = โมฆะ;
-
สำหรับ (;;) {
บูลีนส่วนถัดไป;
ถ้า (ข้ามคำนำ) {
ถัดไปส่วน = multi.skipPreamble();
} อื่น {
ถัดไปส่วน = multi.readBoundary();
-
ถ้า (!ส่วนถัดไป) {
ถ้า (ชื่อสนามปัจจุบัน == null) {
// สิ้นสุดหลายส่วนภายนอก -> ไม่มีข้อมูลอีกต่อไป
อีฟ = จริง;
กลับเท็จ;
-
// multipart ภายในสิ้นสุดลง -> กลับไปแยกวิเคราะห์ด้านนอก
multi.setBoundary (ขอบเขต);
currentFieldName = โมฆะ;
ดำเนินการต่อ;
-
ส่วนหัว FileItemHeaders = getParsedHeaders(multi.readHeaders());
ถ้า (ชื่อสนามปัจจุบัน == null) {
// เรากำลังแยกวิเคราะห์ multipart ภายนอก
สตริง fieldName = getFieldName (ส่วนหัว);
ถ้า (ชื่อฟิลด์ != null) {
สตริง subContentType = headers.getHeader(CONTENT_TYPE);
ถ้า (subContentType != null
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
currentFieldName = ชื่อฟิลด์;
// หลายไฟล์ที่เกี่ยวข้องกับชื่อฟิลด์นี้
ไบต์ [] subBoundary = getBoundary (subContentType);
multi.setBoundary (ขอบเขตย่อย);
ข้ามคำนำ = จริง;
ดำเนินการต่อ;
-
ชื่อไฟล์สตริง = getFileName (ส่วนหัว);
currentItem = FileItemStreamImpl ใหม่ (ชื่อไฟล์,
ชื่อฟิลด์ headers.getHeader (CONTENT_TYPE)
ชื่อไฟล์ == null, getContentLength (ส่วนหัว));
notifier.noteItem();
itemValid = จริง;
กลับเป็นจริง;
-
} อื่น {
ชื่อไฟล์สตริง = getFileName (ส่วนหัว);
ถ้า (ชื่อไฟล์ != null) {
//โค้ดที่นี่จำเป็นต้องได้รับการแก้ไข
//นี่คือโค้ดต้นฉบับ ไม่มีการส่งส่วนหัว
//currentItem = new FileItemStreamImpl(ชื่อไฟล์, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(ส่วนหัว));
//นี่คือโค้ดใหม่ เราต้องส่งผ่านในส่วนหัว
currentItem = ใหม่ FileItemStreamImpl(ชื่อไฟล์, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(ส่วนหัว),ส่วนหัว);
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,
pContentLength ยาว) พ่น IOException {
ชื่อ = pName;
fieldName = pFieldName;
contentType = pContentType;
formField = pFormField;
สุดท้าย ItemInputStream itemStream = multi.newInputStream ();
InputStream istream = itemStream;
ถ้า (fileSizeMax != -1) {
ถ้า (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
ใหม่ FileSizeLimitExceededException(
"ฟิลด์" + ชื่อฟิลด์
+ " เกินจำนวนสูงสุดที่อนุญาต "
+ " ขนาดของ " + fileSizeMax
+ " ตัวอักษร",
pContentLength, fileSizeMax);
โยน FileUploadIOException ใหม่ (e);
-
istream = LimitedInputStream ใหม่ (istream, fileSizeMax) {
โมฆะที่ได้รับการป้องกัน RaiseError (pSizeMax แบบยาว, pCount แบบยาว)
พ่น IOException {
itemStream.close(จริง);
FileUploadException e =
ใหม่ FileSizeLimitExceededException(
"ฟิลด์" + ชื่อฟิลด์
+ " เกินจำนวนสูงสุดที่อนุญาต "
+ " ขนาดของ " + pSizeMax
+ " ตัวอักษร",
pCount, pSizeMax);
โยน FileUploadIOException ใหม่ (e);
-
-
-
สตรีม = ไอสตรีม;
-
/** สร้าง FileItem แก้ไขโค้ด แก้ไขข้อผิดพลาดการสูญเสียข้อมูล FileItemHeaders
* @param pName
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* ส่วนหัว @param
* @throwsIOException
-
FileItemStreamImpl (สตริง pName, สตริง pFieldName,
สตริง pContentType, บูลีน pFormField,
pContentLength แบบยาว, ส่วนหัว FileItemHeaders) พ่น IOException {
ชื่อ = pName;
fieldName = pFieldName;
contentType = pContentType;
formField = pFormField;
ถ้า (ส่วนหัว! = null) {
this.headers = ส่วนหัว;
-
สุดท้าย ItemInputStream itemStream = multi.newInputStream ();
InputStream istream = itemStream;
ถ้า (fileSizeMax != -1) {
ถ้า (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
ใหม่ FileSizeLimitExceededException(
"ฟิลด์" + ชื่อฟิลด์
+ " เกินจำนวนสูงสุดที่อนุญาต "
+ " ขนาดของ " + fileSizeMax
+ " ตัวอักษร",
pContentLength, fileSizeMax);
โยน FileUploadIOException ใหม่ (e);
-
istream = LimitedInputStream ใหม่ (istream, fileSizeMax) {
โมฆะที่ได้รับการป้องกัน RaiseError (pSizeMax แบบยาว, pCount แบบยาว)
พ่น IOException {
itemStream.close(จริง);
FileUploadException e =
ใหม่ FileSizeLimitExceededException(
"ฟิลด์" + ชื่อฟิลด์
+ " เกินจำนวนสูงสุดที่อนุญาต "
+ " ขนาดของ " + pSizeMax
+ " ตัวอักษร",
pCount, pSizeMax);
โยน FileUploadIOException ใหม่ (e);
-
-
-
สตรีม = ไอสตรีม;
-