2009-05-27 15 views
61

Estoy trabajando en una aplicación de iPhone que realiza una solicitud HTTP de varias partes con múltiples archivos de imagen.¿Cómo debería ser una solicitud HTTP multiparte con varios archivos?

Parece que lo que está sucediendo, en el lado del servidor, es que una de las imágenes se está analizando correctamente, pero los otros dos archivos no lo están.

¿Alguien puede publicar una muestra de solicitud multiparte HTTP que contiene múltiples archivos de imagen?

Respuesta

112

Bueno, tenga en cuenta que la solicitud contiene datos binarios, por lo que no estoy publicando la solicitud como tal; en su lugar, he convertido todos los caracteres no imprimibles-ascii en un punto (".").

POST /cgi-bin/qtest HTTP/1.1 
Host: aram 
User-Agent: Mozilla/5.0 Gecko/2009042316 Firefox/3.0.10 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://aram/~martind/banner.htm 
Content-Type: multipart/form-data; boundary=----------287032381131322 
Content-Length: 514 

------------287032381131322 
Content-Disposition: form-data; name="datafile1"; filename="r.gif" 
Content-Type: image/gif 

GIF87a.............,...........D..; 
------------287032381131322 
Content-Disposition: form-data; name="datafile2"; filename="g.gif" 
Content-Type: image/gif 

GIF87a.............,...........D..; 
------------287032381131322 
Content-Disposition: form-data; name="datafile3"; filename="b.gif" 
Content-Type: image/gif 

GIF87a.............,...........D..; 
------------287032381131322-- 

Nota que cada línea (incluyendo el último que termina con "322--") se termina por una secuencia de \ n \ r.

+46

sólo para evitar cualquier confusión : observe que antes de cada cadena de límite en el contenido hay dos guiones adicionales: . Para la última línea es - - –

+0

¿Alguna buena idea sobre cómo crear un archivo de varias partes como este con un bucle for? Mi problema radica en ese extra "-" antes de la \ r \ n final. Si fuera solo al final, podría adjuntarlo ... ¿Haría uno un control si estuviera en el último objeto de su matriz for-loop y añadiera algo diferente? – turkeyhundt

+1

@turkeyhundt: dos opciones vienen inmediatamente a la mente: 1) escriba su bucle como (imprimir límite, imprimir cosas), y luego de completar el bucle for siga con (imprimir límite con guiones adicionales). Esa es probablemente la forma más fácil. 2) escriba su bucle for() para ejecutar cualquier variable de índice que tenga hasta 0, en lugar de hasta 0. Luego, agregue dos guiones adicionales cuando imprima el límite al final si la variable de índice es 0. –

31

EDITAR: estoy manteniendo una respuesta similar, pero más en profundidad: https://stackoverflow.com/a/28380690/895245

Para ver exactamente lo que está sucediendo, utilice nc -l y un agente de usuario como un navegador o rizo.

Guarde el formulario a un archivo .html:

<form action="http://localhost:8000" method="post" enctype="multipart/form-data"> 
    <p><input type="text" name="text" value="text default"> 
    <p><input type="file" name="file1"> 
    <p><input type="file" name="file2"> 
    <p><button type="submit">Submit</button> 
</form> 

crear archivos a subir

echo 'Content of a.txt.' > a.txt 
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html 

Run:

nc -l localhost 8000 

Abra el HTML en el navegador, seleccione los archivos y haga clic en enviar y verifique la terminal.

nc imprime la solicitud recibida. Firefox envió:

POST/HTTP/1.1 
Host: localhost:8000 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266 
Content-Length: 554 

-----------------------------9051914041544843365972754266 
Content-Disposition: form-data; name="text" 

text default 
-----------------------------9051914041544843365972754266 
Content-Disposition: form-data; name="file1"; filename="a.txt" 
Content-Type: text/plain 

Content of a.txt. 

-----------------------------9051914041544843365972754266 
Content-Disposition: form-data; name="file2"; filename="a.html" 
Content-Type: text/html 

<!DOCTYPE html><title>Content of a.html.</title> 

-----------------------------9051914041544843365972754266-- 

Aternativelly, rizo debe enviar la misma petición POST como su forma navegador:

nc -l localhost 8000 
curl -F "text=default" -F "[email protected]" -F "[email protected]" localhost:8000 

Usted puede hacer varias pruebas con:

while true; do printf '' | nc -l localhost 8000; done 
+0

Gracias por la excelente publicación. ¿Cómo se calcula la duración del contenido? ¿Es la longitud de todos los contenidos (por ejemplo, "texto predeterminado") o las descripciones (desde --- 90xx66 hasta --90xx66--)? – mojovski

+0

@mojovski Creo que cuenta todo, pero no 100% seguro. Pruebe con un ejemplo mínimo en su propio navegador con esta técnica + 'wc' para verificarlo + intente leer el estándar HTTP ;-) Creo copiar y pegar desde el desbordamiento de la pila +' xsel -b | wc' no coincide porque los servidores responden con '\ r \ n' al final de cada línea, pero en algún momento se convirtieron a' \ n'. Píñame si concluyes algo. –

Cuestiones relacionadas