Communes de Jakarta Le composant fileupload peut gérer les requêtes et les réponses HTTP. Cependant, nous avons récemment découvert que lorsque nous personnalisons les téléchargements de fichiers, assemblons nous-mêmes les informations MIME et ajoutons des nœuds principaux personnalisés lors du téléchargement de fichiers, le composant fileupload ne peut pas être utilisé. personnalisé. Le nœud principal du fichier est soigneusement analysé. Après avoir chargé le code source du composant, j'ai découvert que la méthode principale se trouve dans la méthode findNextItem du fichier FileUploadBase. Le problème est qu'après que le composant fileupload ait analysé le nœud principal personnalisé, il a oublié de le transmettre à FileItemStreamImpl. révision, ce bug peut être corrigé.
Copiez le code comme suit :
/**Analyser la liste des fichiers
* Appelé pour trouver le prochain élément, le cas échéant.
* @return True, si un élément suivant a été trouvé, sinon false.
* @throws IOException Une erreur d'E/S s'est produite.
*/
le booléen privé findNextItem() lance IOException {
si (eof) {
renvoie faux ;
}
si (élément actuel != null) {
élémentactuel.close();
élément actuel = null ;
}
pour (;;) {
booléen nextPart ;
if (skipPreambul) {
nextPart = multi.skipPreamble();
} autre {
nextPart = multi.readBoundary();
}
si (!nextPart) {
if (currentFieldName == null) {
// Multipart externe terminé -> Plus de données
eof = vrai ;
renvoie faux ;
}
// Multipart interne terminé -> Retour à l'analyse de l'externe
multi.setBoundary(limite);
nom de champ actuel = null ;
continuer;
}
En-têtes FileItemHeaders = getParsedHeaders(multi.readHeaders());
if (currentFieldName == null) {
// Nous analysons le multipart externe
String fieldName = getFieldName(headers);
if (fieldName != null) {
Chaîne subContentType = headers.getHeader(CONTENT_TYPE);
si (subContentType != null
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
nom de champ actuel = nom de champ ;
// Plusieurs fichiers associés à ce nom de champ
byte[] subBoundary = getBoundary(subContentType);
multi.setBoundary(subBoundary);
skipPreamble = vrai ;
continuer;
}
String fileName = getFileName (en-têtes);
currentItem = nouveau FileItemStreamImpl (nom de fichier,
fieldName, headers.getHeader(CONTENT_TYPE),
fileName == null, getContentLength(headers));
notifier.noteItem();
itemValid = vrai ;
renvoie vrai ;
}
} autre {
String fileName = getFileName (en-têtes);
if (fileName != null) {
//Le code ici doit être révisé
// Ceci est le code original, aucun en-tête n'est transmis
//currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers));
// Ceci est un nouveau code, nous devons le passer dans l'en-tête
currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers),headers);
notifier.noteItem();
itemValid = vrai ;
renvoie vrai ;
}
}
multi.discardBodyData();
}
}
/**Code original, il y a un bug de perte des informations FileItemHeaders
* Crée une nouvelle instance.
* @param pName Le nom du fichier d'éléments, ou null.
* @param pFieldName Le nom du champ des éléments.
* @param pContentType Le type de contenu des éléments, ou null.
* @param pFormField Indique si l'élément est un champ de formulaire.
* @param pContentLength La longueur du contenu des éléments, si elle est connue, ou -1
* @throws IOException La création de l'élément de fichier a échoué.
*/
FileItemStreamImpl(String pName, String pFieldName,
Chaîne pContentType, booléen pFormField,
long pContentLength) lance IOException {
nom = pNom ;
fieldName = pFieldName ;
contentType = pContentType;
formField = pFormField;
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream ;
si (fileSizeMax != -1) {
si (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
nouveau FileSizeLimitExceededException (
"Le champ" + fieldName
+ "dépasse son maximum autorisé"
+ " taille de " + fileSizeMax
+ " personnages.",
pContentLength, fileSizeMax);
lancer une nouvelle FileUploadIOException(e);
}
istream = nouveau LimitedInputStream (istream, fileSizeMax) {
protected void raiseError (long pSizeMax, long pCount)
lance IOException {
itemStream.close(true);
FileUploadException e =
nouveau FileSizeLimitExceededException (
"Le champ" + fieldName
+ "dépasse son maximum autorisé"
+ " taille de " + pTailleMax
+ " personnages.",
pCount, pSizeMax);
lancer une nouvelle FileUploadIOException(e);
}
} ;
}
flux = istream ;
}
/** Créer FileItem, code révisé, résoudre le bug de perte des informations FileItemHeaders
* @param pName
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* En-têtes @param
* @throwsIOException
*/
FileItemStreamImpl(String pName, String pFieldName,
Chaîne pContentType, booléen pFormField,
long pContentLength, en-têtes FileItemHeaders) lance IOException {
nom = pNom ;
fieldName = pFieldName ;
contentType = pContentType;
formField = pFormField;
si(en-têtes!=null){
this.headers = en-têtes ;
}
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream ;
si (fileSizeMax != -1) {
si (pContentLength != -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
nouveau FileSizeLimitExceededException (
"Le champ" + fieldName
+ "dépasse son maximum autorisé"
+ " taille de " + fileSizeMax
+ " personnages.",
pContentLength, fileSizeMax);
lancer une nouvelle FileUploadIOException(e);
}
istream = nouveau LimitedInputStream (istream, fileSizeMax) {
protected void raiseError (long pSizeMax, long pCount)
lance IOException {
itemStream.close(true);
FileUploadException e =
nouveau FileSizeLimitExceededException (
"Le champ" + fieldName
+ "dépasse son maximum autorisé"
+ " taille de " + pTailleMax
+ " personnages.",
pCount, pSizeMax);
lancer une nouvelle FileUploadIOException(e);
}
} ;
}
flux = istream ;
}