2012-03-04 17 views
6

Tengo una pregunta rápida sobre las cargas de archivos POST en ActionScript 3. Estoy intentando subir un ByteArray desde la memoria a través de POST a un servidor. Estoy usando la clase URLRequest para enviar los datos, y URLLoader porque quiero monitorear el progreso. Las secciones pertinentes del Código de la siguiente manera:Carga de archivo POST usando URLRequest

var uploadRequest:URLRequest = new URLRequest("http://127.0.0.1/upload.php"); 
uploadRequest.method = URLRequestMethod.POST; 
uploadRequest.contentType = "multipart/form-data"; 
uploadRequest.data = myByteArray; 

var uploader:URLLoader = new URLLoader; 
uploader.addEventListener(ProgressEvent.PROGRESS, onUploadProgress); 
uploader.addEventListener(Event.COMPLETE, onUploadComplete); 
uploader.dataFormat = URLLoaderDataFormat.BINARY; 
uploader.load(uploadRequest); 

El problema es que he puesto mis devoluciones de llamada para rastrear el progreso de la carga, y la propiedad de la bytesTotal ProgressEvent siempre es 1960 (el tamaño de los datos de solicitud de menos?) , aunque los datos reales sean de alrededor de 20 MB y no se cargue ningún archivo incluso después de que se desactive el evento Completo.

He verificado que upload.php funciona correctamente con un formulario html simple, y puedo verificar que myByteArray contiene todos los datos en cuestión. ¿Alguien puede decirme lo que estoy haciendo mal?

Editar:

he intentado un par de cosas nuevas que pensé que debería mencionar. El primero es establecer el tipo de contenido en application/octet-stream en lugar de multipart/form-data, que no tuvo otro efecto que aumentar el número de bytes a 1964. También verifiqué el registro de errores de Apache y encontré que el siguiente texto se repetía mucho. :

PHP Warning: Missing boundary in multipart/form-data POST data in Unknown on line 0

Supongo que Flash no está formateando correctamente la solicitud HTTP por el motivo que sea. Dado que creé una FileReference que hace uso de los mismos métodos que configuré para que el URLLoader cargue un archivo desde el disco, obtuve el resultado esperado: la propiedad bytesTotal coincidía con el tamaño del archivo y el archivo se cargaba correctamente.

Trabajando desde que he encontrado una página en la documentación de desarrolladores de Adobe que menciona la carga de datos a un servidor utilizando FileReference.upload() define el parámetro de datos del URLRequest, así que probé el siguiente código:

var uploadRequest:URLRequest = new URLRequest("http://127.0.0.1/upload.php"); 
uploadRequest.method = URLRequestMethod.POST; 
uploadRequest.data = myByteArray; 

fileRef = new FileReference; 
fileRef.addEventListener(ProgressEvent.PROGRESS, onUploadProgress); 
fileRef.addEventListener(Event.COMPLETE, onUploadComplete); 
fileRef.upload(uploadRequest); 

que dio lugar a la siguiente salida:

ArgumentError: Error #2127: FileReference POST data cannot be type ByteArray.

realmente me pegan aquí. ¡Cualquier sugerencia sera apreciada!

+0

Ha intentado - uploadRequest.contentType = "application/octet-stream"; – Neil

+0

Mismo resultado, la única diferencia es que bytesTotal es 1964 (los cuatro caracteres adicionales). ¡Gracias por la sugerencia! –

+0

Una actualización rápida para cualquier persona interesada. Verifiqué el registro de errores de Apache y cada intento de cargar los resultados del archivo en esta línea: "Advertencia de PHP: Falta el límite en datos de POST multipart/form-data en Desconocido en la línea 0" –

Respuesta

8

Usted debe agregar más información a la "Content-Type" de cabecera:

uploadRequest.contentType = "multipart/form-data; boundary=<<boundary here>>"; 

Comprobar ejemplo aquí: http://marstonstudio.com/?p=36

+0

¡Eso funcionó! Muchas gracias! Supuse que Flash agregaría los límites para mí. No es de extrañar que no funcionara. –

+0

Me alegra oírlo. :) – deadrunk

+3

El enlace está roto – Soid

Cuestiones relacionadas