NSMutableURLRequest: cargar un archivo usando setHTTPBodyStream en lugar de setHTTPBody

Actualmente estoy cargando archivos a través de HTTP Post, usando [body appendData: [NSData dataWithData:data]]; donde data es mi representación NSMutableData del archivo.

// Set content type to be form data
NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];

// Set content type to be form data
NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];

// Set up web request with HTTP post headers for 1 form field which is the image
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\".jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding: NSUTF8StringEncoding]];
[body appendData: [NSData dataWithData:data]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding: NSUTF8StringEncoding]];

// Set the body
[request setHTTPBody: body];

Debido a limitaciones de memoria, he leído que es mejor cargar usando setHTTPBodyStream y pasar la ubicación del archivo en el disco: ¿cómo haría para configurar otros atributos, como la disposición del contenido, usando este método?

preguntado el 27 de julio de 12 a las 17:07

1 Respuestas

Debe preparar un archivo que contenga todo el cuerpo de la solicitud HTML, incluidos los límites de varias partes, el tipo de contenido y la disposición, y utilizarlo para setHTTPBodyStream.

Hay alternativas (subclases NSInputStream, que parece ser un poco complicado, y bibliotecas de terceros como ASIHTTPRequest). Esta post proporciona más información y enlaces.

contestado el 23 de mayo de 17 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.