Cómo cargar varios archivos
Aprobado
Host: 192.168.29.65:80
Tipo de contenido:multipart/form-data ;límite=------- --------------------7d33a816d302b6
Agente de usuario: Mozilla/4.0 (compatible; OpenOffice. org)
Longitud del contenido: 424
Conexión: Keep-Alive ------------------------ -----7d33a816d302b6
Disposición-de-contenido:datos-de-formulario;
nombre="userfile1";
filename="E:\s "Tipo-de-contenido:
aplicación/octet-stream abbXXXccc
-----------------------7d33a816d302b6
Disposición-de-contenido: datos-formulario
name="text1" foo
---------------- -------------7d33a816d302b6
Contenido-Disposición.form-data;
nombre="contraseña1 "bar
- ----------------------7d33a816d302b6--
(Hay un retorno de carro en la parte superior). El contenido debe ser una palabra. Nada mal, incluido el retorno de carro al final.
Nota: Longitud del contenido: 424 El 424 aquí es la longitud total del contenido rojo (incluido el retorno de carro final)
Preste atención a esta línea: Tipo de contenido: multiparte /form-data ; limite=----------------------- ----7d33a816d302b6
Según rfc1867, multipart/form- Se requieren datos. -----------------------7d33a816d302b6 es el delimitador utilizado para separar varios archivos y elementos de formulario.
33a816d302b6 es un número que se genera sobre la marcha para garantizar que el delimitador completo no aparezca en el contenido del archivo o elemento del formulario. El ----------------------------7d anterior es un indicador específico de IE.
Mozila envió este ejemplo manualmente para ---------------------------71, que también funciona en el servlet anterior Works normalmente.
Uso de POST para enviar datos
El uso de POST para enviar datos se utiliza principalmente para enviar grandes cantidades de datos del cliente al servidor y no está limitado por la longitud de la URL. Una solicitud POST coloca datos en el cuerpo del mensaje HTTP en formato URL codificado, con campos en el formato nombre de campo=valor, con cada campo separado por &. .Tenga en cuenta que todos los campos se tratan como cadenas. En realidad, estamos simulando un formulario POST del navegador.
La siguiente es la solicitud POST para que IE envíe el formulario de inicio de sesión:
POST ;q=0.5
Tipo de contenido: aplicación/x-www-form-urlencoded
Agente de usuario: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Longitud del contenido: 28
\r\n
nombre de usuario=admin&contraseña= 1234
Para simular que el navegador envía esta solicitud POST en una aplicación MIDP, primero configure el método de solicitud de HttpConnection en POST:
hc.setRequestMethod(HttpConnection.POST) ;
Luego construye el cuerpo HTTP:
byte[] data = " nombre de usuario=admin&password=1234".getBytes();
Luego calcula la longitud de el cuerpo y complete el Contenido -Tipo y Contenido-Longitud:
hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); >hc.setRequestProperty("Content -Length", String.valueOf(data.length));
Luego abra OutputStream para escribir el texto:
OutputStream salida = hc.openOutputStream ();
output.write(data);
Tenga en cuenta que los datos aún deben codificarse en formato de codificación URL y, dado que no existe ninguna codificación correspondiente a J2SE en MIDP. biblioteca, el cuerpo no se puede escribir en formato de codificación URL. No existe una clase URLEncoder correspondiente en J2SE, por lo que debe escribir el método encode () usted mismo. Puede consultar el código fuente de java.net.URLEncoder.java. El resto es leer la respuesta del servidor. El código es coherente con GET y no se detallará aquí.
Envío de archivos usando multipart/form-data
Si queremos cargar archivos desde el cliente MIDP al servidor, debemos simular una solicitud POST multipart/form-data, y el Content- El tipo debe ser multiparte/formulario.
El formato de solicitud POST codificado con multipart/form-data es completamente diferente de application/x-www-form-urlencoded. multipart/form-data requiere que primero establezca un delimitador en el encabezado de la solicitud HTTP, como ABCD:
hc.p>
hc.setRequestProperty("Content-Type", " multipart/form-data; limite=ABCD");
Luego, separe cada campo con "--separator". El último "--separador--" indica el final.
Por ejemplo, para cargar el campo de encabezado "Hoy" y el archivo C:\1.txt, el cuerpo HTTP se vería así:
--ABCD
Contenido-Disposición: form-data; name="title"
\r\n
Hoy
--ABCD
Disposición de contenido: formulario -data; nombre="1.txt"; nombre de archivo="C:\1.txt"
Tipo de contenido: texto/sin formato
r\n
Hoy. --ABCD--
\r\n
Tenga en cuenta que cada línea debe terminar con \r\n, incluida la última línea. Si utiliza el programa Sniffer para detectar la solicitud POST enviada por IE, puede encontrar que el delimitador de IE es similar a ------------------------ ---7d4a6d158c9, que es un número aleatorio generado por IE para evitar que el servidor identifique correctamente la posición inicial del archivo debido a los delimitadores en el archivo cargado. Podemos escribir un delimitador fijo siempre que sea lo suficientemente complejo.
El código POST para enviar archivos es el siguiente:
String[] props = ...// Nombre del campo
String[] value = ...// Valor del campo
byte[] archivo = ...
Cadena LÍMITE = "----------------- ----- -----7d4a6d158c9"; // separador
StringBuffer sb = new StringBuffer();
// Enviar cada campo.
for(int i=0; i
sb = sb.append("--");
sb = sb.append(BOUNDARY);
sb = sb.append("\r\n");
sb = sb.append("Contenido-Disposición")append(" Contenido-Disposición: formulario-datos ; nombre=""+ accesorios[i] + "\"\r\r\n");
sb = sb.append(URLEncoder.encode(valores[i]));
sb = sb.append("\r\n");
}
// Enviar archivo: append("Tipo de contenido: aplicación/octeto-stream \r\n");
byte[] datos = sb.toString().getBytes();
byte[] end_data = ("\r\n--" + LÍMITE + "\r\n").getBytes();
/ / Establecer encabezado HTTP:
hc.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; límite =" + LÍMITE);
hc.setRequestProperty("Contenido-Longitud", String.valueOf(data.length + file.length + end_data.length));
// Salida:
salida = hc.openOutputStream();
salida.write(datos);
salida.write(archivo); p>output.write(end_data);
// Leer respuesta del servidor:
// TODO...