يمكن لمكون تحميل الملفات المشترك في جاكرتا التعامل مع طلبات واستجابات HTTP، وغالبًا ما يتم استخدامه للتعامل مع تحميل الملفات، ومع ذلك، فقد اكتشف مؤخرًا أنه عندما نقوم بتخصيص تحميلات الملفات، ونجمع معلومات mime بأنفسنا، ونضيف عقد رأس مخصصة عند تحميل الملفات. لا يمكن الحصول عليها بعد تحليل الكود المصدري لمكون تحميل الملف بعناية، وجدنا أن الطريقة الأساسية موجودة في طريقة findNextItem لملف FileUploadBase، والمشكلة هي أنه بعد تحليل مكون تحميل الملف للعقدة الرئيسية المخصصة، نسي تمريرها إلى FileItemStreamImpl يرجى مراجعته قليلاً، ويمكن إصلاح الخلل.
انسخ رمز الكود كما يلي:
/ ** تحليل قائمة الملفات
* مطلوب للعثور على العنصر التالي، إن وجد.
* @return صحيح، إذا تم العثور على العنصر التالي، وإلا فهو خطأ.
*throws IOException حدث خطأ في الإدخال/الإخراج.
*/
منطقية خاصة findNextItem() تطرح IOException {
إذا (إي أوف) {
عودة كاذبة.
}
إذا (العنصر الحالي! = فارغ) {
currentItem. Close();
العنصر الحالي = فارغ؛
}
ل (؛؛) {
الجزء التالي المنطقي؛
إذا (تخطيالPreamble) {
nextPart = multi.skipPreamble();
} آخر {
nextPart = multi.readBoundary();
}
إذا (!الجزء التالي) {
إذا (اسم الحقل الحالي == فارغ) {
// تم إنهاء الأجزاء المتعددة الخارجية -> لا مزيد من البيانات
eof = صحيح؛
عودة كاذبة.
}
// تم إنهاء الأجزاء الداخلية المتعددة -> العودة إلى تحليل الأجزاء الخارجية
multi.setBoundary(boundary);
currentFieldName = null;
يكمل؛
}
FileItemHeaders headers = getParsedHeaders(multi.readHeaders());
إذا (اسم الحقل الحالي == فارغ) {
// نحن نقوم بتحليل الأجزاء الخارجية المتعددة
String fieldName = getFieldName(headers);
إذا (اسم الحقل! = فارغ) {
String subContentType = headers.getHeader(CONTENT_TYPE);
if (subContentType != null
&& subContentType.toLowerCase()
.يبدأ مع (MULTIPART_MIXED)) {
currentFieldName = fieldName;
// ملفات متعددة مرتبطة باسم الحقل هذا
byte[] subBoundary = getBoundary(subContentType);
multi.setBoundary(subBoundary);
SkipPreamble = true;
يكمل؛
}
String fileName = getFileName(headers);
currentItem = new FileItemStreamImpl(fileName,
اسم الحقل، headers.getHeader(CONTENT_TYPE)،
fileName == null, getContentLength(headers));
notifier.noteItem();
itemValid = true;
عودة صحيحة؛
}
} آخر {
String fileName = getFileName(headers);
إذا (اسم الملف! = فارغ) {
// يحتاج الكود هنا إلى المراجعة
// هذا هو الكود الأصلي، ولم يتم تمرير أي رأس
//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;
عودة صحيحة؛
}
}
multi.discardBodyData();
}
}
/ ** الكود الأصلي، هناك خطأ في فقدان معلومات FileItemHeaders
* إنشاء مثيل جديد.
*param pName اسم ملف العناصر، أو فارغ.
* @param pFieldName اسم حقل العناصر.
* @param pContentType نوع محتوى العناصر، أو فارغ.
* @param pFormField ما إذا كان العنصر عبارة عن حقل نموذج.
* @param pContentLength طول محتوى العناصر، إذا كان معروفًا، أو -1
* @throws IOException فشل إنشاء عنصر الملف.
*/
FileItemStreamImpl (سلسلة pName، سلسلة pFieldName،
سلسلة pContentType، pFormField منطقية،
طويل pContentLength) يلقي IOException {
name = pName;
fieldName = pFieldName;
contentType = pContentType;
formField = pFormField;
Final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
إذا (fileSizeMax != -1) {
إذا (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
جديد FileSizeLimitExceededException (
"الحقل" + اسم الحقل
+ "يتجاوز الحد الأقصى المسموح به"
+ "حجم" + fileSizeMax
+ "الشخصيات."،
pContentLength, fileSizeMax);
رمي FileUploadIOException (e) الجديد ؛
}
istream = new LimitedInputStream(istream, fileSizeMax) {
خطأ محمي باطل (pSizeMax طويل، pCount طويل)
يلقي IOException {
itemStream. Close(true);
FileUploadException e =
جديد 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 {
name = pName;
fieldName = pFieldName;
contentType = pContentType;
formField = pFormField;
إذا (الرؤوس! = فارغة) {
this.headers = headers;
}
Final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
إذا (fileSizeMax != -1) {
إذا (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
جديد FileSizeLimitExceededException (
"الحقل" + اسم الحقل
+ "يتجاوز الحد الأقصى المسموح به"
+ "حجم" + fileSizeMax
+ "الشخصيات."،
pContentLength, fileSizeMax);
رمي FileUploadIOException (e) الجديد ؛
}
istream = new LimitedInputStream(istream, fileSizeMax) {
خطأ محمي باطل (pSizeMax طويل، pCount طويل)
يلقي IOException {
itemStream. Close(true);
FileUploadException e =
جديد FileSizeLimitExceededException (
"الحقل" + اسم الحقل
+ "يتجاوز الحد الأقصى المسموح به"
+ "حجم" + pSizeMax
+ "الشخصيات."،
pCount، pSizeMax)؛
رمي FileUploadIOException (e) الجديد ؛
}
};
}
تيار = istream.
}