Red de conocimiento informático - Material del sitio web - Cómo cargar varios archivos al mismo tiempo

Cómo cargar varios archivos al mismo tiempo

Significado ENCTYPE="multipart/form-data" Descripción:

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

name="userfile1";

filename="E:\s "Tipo de contenido:

p>

aplicación/octet-stream abbXXXccc

-----------------------7d33a816d302b6

Disposición de contenido: datos de formulario

name="text1" foo

---------------- - ------------7d33a816d302b6

Contenido-Disposición.form-data;

nombre="contraseña1 "bar

- - ---------------------7d33a816d302b6--

(Hay un retorno de carro en la parte superior). Este contenido Debe haber 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 generado 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. La solicitud POST coloca los datos en el cuerpo del mensaje HTTP en formato URL codificado, con el formato de campo nombre de campo=valor y cada campo separado por amp;.

.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=adminamp; 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 = "username=adminamp;password=1234".getBytes(); calcule el contenido de la longitud del cuerpo, complete el tipo de contenido y la longitud del contenido:

hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"

hc.setRequestProperty("Content-Length", String.valueOf(data.length));

Luego abra OutputStream para escribir el texto:

Salida de OutputStream. = hc.openOutputStream();

output.write(data);

Tenga en cuenta que los datos aún deben codificarse en formato de codificación URL ya que no hay codificación correspondiente a J2SE. en la biblioteca MIDP, no se puede escribir en formato de codificación URL. Ingrese el texto. 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 una solicitud POST codificada en 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="" props[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[] data = sb.toString().getBytes();

byte[] end_data = ("\r\n--" LÍMITE " \r\n").getBytes();

/ / Establecer encabezado HTTP:

hc.setRequestProperty("Content-Type", MULTIPART_FORM_DATA "; limite=" BOUNDARY);

hc.setRequestProperty("Content-Length", String.valueOf(data.length file.length end_data.length));

// Salida:

salida = hc.openOutputStream();

salida.write(datos

salida.write(archivo

salida.write(end_data); ;

// Leer respuesta del servidor:

// TODO...