Ich habe eine Client-Anwendung in Android, die HttpURLConnection
verwendet, um Dateien an den Server zu senden. Der Server verwendet die Apache Commons FileUpload-API zum Analysieren der Formulardatenwerte.ServletFileUpload # parseRequest (Anfrage) gibt eine leere Liste zurück
The HttpURLConnection
sendet diese Anfrage:
-----------------------------4912995119421
Content-Disposition: form-data; name="deviceid"
9428103
-----------------------------4912995119421
Content-Disposition: form-data; name="countryid"
598
-----------------------------4912995119421
Content-Disposition: form-data; name="number"
98621360
-----------------------------4912995119421
Content-Disposition: form-data; name="file"; filename="2012-12-08 17.42.18.jpg"
Content-Type: image/jpeg
ÿØÿá1 Exif II*
@ ° ª
² ¼ Ä ( 1 Ì 2 Ø i‡ ì %ˆ \ n SAMSUNG GT-S5360L H H S5360LUHLB1 2012:12:08 17:42:18 š‚ î ?‚ ö "ˆ 'ˆ È ? 0220? þ ? ‘ ’ & ’
’ . 0100 @ ° > £ ¤ ¤ ¤ 6 ¤
2012:12:08 17:42:18 2012:12:08 17:42:18
d R98 0100 ( ¤ T. ÿØÿà JFIF ÿÛ C @@ÿÛ
-----------------------------4912995119421--
Der Server-Code:
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") == -1)) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
long maxFileSize = (2 * 1024 * 1024);
int maxMemSize = (2 * 1024 * 1024);
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax(maxFileSize);
List fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
//leo primero todas las variables.
int deviceID = 0;
int countryID = 0;
String phoneNumber = "";
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (fi.isFormField()) {
String variable = fi.getFieldName();
if (variable.equals("deviceid")) {
deviceID = Integer.parseInt(fi.getString());
} else if (variable.equals("countryid")) {
countryID = Integer.parseInt(fi.getString());
} else if (variable.equals("number")) {
phoneNumber = String.valueOf(Long.parseLong(fi.getString()));
}
}
}
if (deviceID == 0 || countryID == 0 || phoneNumber.equals("")) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
Das Problem in der Leitung ist List fileItems = upload.parseRequest(request);
. Die zurückgegebene Liste ist leer und ich kann die Formulardatenwerte nicht abrufen.
Ich überprüft mit: request.getInputStream() byte [] a = neues Byte [8096]; int r = 0; ServletInputStream s = request.getInputStream(); Zeichenfolge c = ""; while ((r = s.read (a))! = -1) { c + = neuer String (a) .substring (0, r); } Und erhielt die Daten in Ordnung. Das Problem ist, dass der Commond File Upload den Inhalt nicht parsen kann. – toto
Nun, wenn Sie diesen 'request.getInputStream()' Aufruf entfernen, dann sollte es gut funktionieren, genau wie in meiner Antwort erklärt. – BalusC
Okay, ich gehe davon aus, dass Sie vorher keine der genannten Methoden aufrufen. Dieses Problem kann dann nur bedeuten, dass Sie den richtigen Begrenzungsheader nicht festgelegt haben oder wenn Sie die falschen Zeilenumbrüche verwendet haben. Ein konkretes Beispiel finden Sie am Ende von http://stackoverflow.com/a/2793153 unter dem Abschnitt "Hochladen von Dateien". – BalusC