Jakarta Commons Die Datei-Upload-Komponente kann HTTP-Anfragen und -Antworten verarbeiten. Sie wird jedoch häufig zum Bearbeiten von Datei-Uploads verwendet, wenn wir beim Hochladen von Dateien selbst MIME-Informationen zusammenstellen und benutzerdefinierte Kopfknoten hinzufügen Der Kopfknoten des Fileu wird sorgfältig analysiert. Nach dem Laden des Quellcodes der Komponente habe ich festgestellt, dass sich die Kernmethode in der findNextItem-Methode der FileUploadBase-Datei befindet. Das Problem besteht darin, dass die Fileupload-Komponente nach dem Parsen des benutzerdefinierten Kopfknotens vergessen hat, ihn an FileItemStreamImpl zu übergeben Revision kann dieser Fehler behoben werden.
Kopieren Sie den Codecode wie folgt:
/**Dateiliste analysieren
* Wird aufgerufen, um ggf. den nächsten Gegenstand zu finden.
* @return True, wenn ein nächstes Element gefunden wurde, andernfalls false.
* @throws IOException Ein E/A-Fehler ist aufgetreten.
*/
privater boolescher Wert findNextItem() löst eine IOException { aus
if (eof) {
return false;
}
if (currentItem != null) {
currentItem.close();
currentItem = null;
}
für (;;) {
boolean nextPart;
if (skipPreamble) {
nextPart = multi.skipPreamble();
} anders {
nextPart = multi.readBoundary();
}
if (!nextPart) {
if (currentFieldName == null) {
// Äußeres Multipart beendet -> Keine Daten mehr
eof = wahr;
return false;
}
// Inneres Multipart beendet -> Zurück zum Parsen des Äußeren
multi.setBoundary(boundary);
currentFieldName = null;
weitermachen;
}
FileItemHeaders headers = getParsedHeaders(multi.readHeaders());
if (currentFieldName == null) {
// Wir analysieren den äußeren Multipart
String fieldName = getFieldName(headers);
if (fieldName != null) {
String subContentType = headers.getHeader(CONTENT_TYPE);
if (subContentType != null
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
currentFieldName = fieldName;
// Mehrere mit diesem Feldnamen verknüpfte Dateien
byte[] subBoundary = getBoundary(subContentType);
multi.setBoundary(subBoundary);
skipPreamble = true;
weitermachen;
}
String fileName = getFileName(headers);
currentItem = new FileItemStreamImpl(fileName,
fieldName, headers.getHeader(CONTENT_TYPE),
fileName == null, getContentLength(headers));
notifier.noteItem();
itemValid = true;
return true;
}
} anders {
String fileName = getFileName(headers);
if (fileName != null) {
//Der Code hier muss überarbeitet werden
//Dies ist der Originalcode, es wird kein Header übergeben
//currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers));
//Das ist neuer Code, wir müssen den Header übergeben
currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers),headers);
notifier.noteItem();
itemValid = true;
return true;
}
}
multi.discardBodyData();
}
}
/**Originalcode, es gibt einen Fehler, der dazu führt, dass FileItemHeaders-Informationen verloren gehen
* Erstellt eine neue Instanz.
* @param pName Der Dateiname des Elements oder null.
* @param pFieldName Der Feldname des Elements.
* @param pContentType Der Inhaltstyp des Elements oder null.
* @param pFormField Ob das Element ein Formularfeld ist.
* @param pContentLength Die Inhaltslänge des Elements, falls bekannt, oder -1
* @throws IOException Das Erstellen des Dateielements ist fehlgeschlagen.
*/
FileItemStreamImpl(String pName, String pFieldName,
String pContentType, boolean pFormField,
long pContentLength) wirft IOException {
name = pName;
fieldName = pFieldName;
contentType = pContentType;
formField = pFormField;
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
if (fileSizeMax != -1) {
if (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
neue FileSizeLimitExceededException(
„Das Feld“ + Feldname
+ „übersteigt das zulässige Maximum“
+ „Größe von“ + fileSizeMax
+ „Zeichen.“,
pContentLength, fileSizeMax);
throw new FileUploadIOException(e);
}
istream = new LimitedInputStream(istream, fileSizeMax) {
protected void raiseError(long pSizeMax, long pCount)
wirft IOException {
itemStream.close(true);
FileUploadException e =
neue FileSizeLimitExceededException(
„Das Feld“ + Feldname
+ „übersteigt das zulässige Maximum“
+ „Größe von“ + pSizeMax
+ „Zeichen.“,
pCount, pSizeMax);
throw new FileUploadIOException(e);
}
};
}
stream = istream;
}
/** Erstelle FileItem, überarbeiteten Code, behebe den Fehler, der durch den Verlust von FileItemHeaders-Informationen entsteht
* @param pName
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* @param-Header
* @throwsIOException
*/
FileItemStreamImpl(String pName, String pFieldName,
String pContentType, boolean pFormField,
lange pContentLength,FileItemHeaders-Header) löst eine IOException {
name = pName;
fieldName = pFieldName;
contentType = pContentType;
formField = pFormField;
if(headers!=null){
this.headers = Header;
}
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
if (fileSizeMax != -1) {
if (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
neue FileSizeLimitExceededException(
„Das Feld“ + Feldname
+ „übersteigt das zulässige Maximum“
+ „Größe von“ + fileSizeMax
+ „Zeichen.“,
pContentLength, fileSizeMax);
throw new FileUploadIOException(e);
}
istream = new LimitedInputStream(istream, fileSizeMax) {
protected void raiseError(long pSizeMax, long pCount)
wirft IOException {
itemStream.close(true);
FileUploadException e =
neue FileSizeLimitExceededException(
„Das Feld“ + Feldname
+ „übersteigt das zulässige Maximum“
+ „Größe von“ + pSizeMax
+ „Zeichen.“,
pCount, pSizeMax);
throw new FileUploadIOException(e);
}
};
}
stream = istream;
}