Comment puis-je lire le contenu de l'en-tête content-disposition?
TEMPORAIRE RÉSOLU: InputStream fermé dans Apache FileUpload API
Je veux lire le contenu de l'en-tête content-disposition mais request.getHeader ("content-disposition")
toujours retourner la valeur null et request.getHeader ("content-type")
retourne uniquement la première ligne, comme ceci multipart/form-data; boundary=AaB03x
.
Supose-je recevoir l'en-tête suivant:
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
Je veux lire tout le contenu-disposition des en-têtes. Comment?
Grâce.
EDIT1: Ce que je veux vraiment à résoudre est le problème lorsque le client envoie un fichier dépasse la taille maximale parce que quand vous demande d'appel.getPart ("quelque chose"), il n'a pas d'importance quelle partie du nom que vous passez à elle parce qu'elle a toujours lèvera une exception IllegalStateException même si la demande ne contient pas de ce nom de paramètre.
Exemple:
Part part = request.getPart ("param");
String value = getValue (part);
if (value.equals ("1")){
doSomethingWithFile1 (request.getPart ("file1"))
}else if (value.equals (2)){
doSomethingWithFile2 (request.getPart ("file2"))
}
private String getValue (Part part) throws IOException{
if (part == null) return null;
BufferedReader in = null;
try{
in = new BufferedReader (new InputStreamReader (part.getInputStream (), request.getCharacterEncoding ()));
}catch (UnsupportedEncodingException e){}
StringBuilder value = new StringBuilder ();
char[] buffer = new char[1024];
for (int bytesRead; (bytesRead = in.read (buffer)) != -1;) {
value.append (buffer, 0, bytesRead);
}
return value.toString ();
}
Je ne peux pas faire cela parce que si le client envoie un fichier dépasse la taille maximale que le premier appel à getPart lève l'exception (voir getPart() Javadoc), donc je ne peux pas savoir quel fichier je l'ai reçu.
C'est pourquoi je veux lire le contenu-disposition des en-têtes. Je veux lire le paramètre "param" pour savoir quel fichier a jeté l'exception.
EDIT2: eh Bien, avec l'API qui publie la Servlet 3.0 spécifications que vous ne pouvez pas contrôler le cas précédent, car si un fichier déclenche une exception vous ne pouvez pas lire le fichier nom du champ. C'est la partie négative de l'utilisation d'un wrapper parce que beaucoup de fonctionnalités disparaissent... avec FileUpload vous pouvez définir dynamiquement la MultipartConfig annotation.
Si le fichier dépasse la taille maximale des fichiers de l'api renvoie une FileSizeLimitExceededException exception. L'exception propose 2 méthodes pour obtenir le nom du champ et le nom de fichier.
Mais!! mon problème n'est pas encore résolu, car je veux lire la valeur d'un autre paramètre envoyé avec le fichier dans le même formulaire. (la valeur de "param" dans l'exemple précédent)
EDIT3: je suis en train de travailler sur ce. Dès que j'écris le code, je vais le publier ici!
- Pas un doublon.
Vous devez vous connecter pour publier un commentaire.
request.getHeader ("content-disposition")
renvoie la valeur null dans votre cas, comme leContent-Disposition
en-têtes apparaissent dans le corps POST HTTP, ce qui nécessite d'être traités séparément. En fait,Content-Disposition
est seulement valide en-tête de réponse HTTP. Dans le cadre d'une demande, il ne sera jamais traitée comme un en-tête.Il est préférable d'utiliser un téléchargement de fichier de la bibliothèque comme Commons FileUpload ou intégré de téléchargement de fichiers caractéristiques de la Servlet Spec 3.0 pour lire la
Content-Disposition
en-tête (indirectement). Java EE 6 conteneurs qui sont nécessaires pour mettre en œuvre le fichier de téléchargement de la fonctionnalité nécessaire de Servlet Spec 3.0, souvent l'utilisation d'Apache Commons FileUpload sous le capot.Si vous souhaitez ignorer ces bibliothèques pour une raison valable et, au lieu de lire les en-têtes de vous-même, alors je vous recommande de regarder le
parseHeaderLine
etgetParsedHeaders
méthodes de laFileUploadBase
classe de Apache Commons FileUpload. Ne noter que ces méthodes lu à partir de laInputStream
associés à laHttpServletRequest
, et vous ne pouvez pas lire le flux à deux reprises. Si vous voulez lire leContent-Disposition
en-tête de votre code d'abord, et plus tard l'utilisation d'Apache Commons FileUpload pour analyser la demande, vous devrez passer unServletRequestWrapper
qui encapsule une copie si la demande initiale à la FileUpload API. La séquence inverse exige également de vous créer une copie de l'original de la demande et de passer unServletRequestWrapper
habillage de cette copie à la FileUpload API. Dans l'ensemble, c'est une mauvaise conception, car il ne fait aucun sens de la réplique d'un ensemble de flux en mémoire (ou sur le disque) seulement à lire le corps de la requête à deux reprises.Essayez d'utiliser
part.getName()
Ici est un exemple.
Fichier Html:
Servlet: