No puedo entender por qué esto es tan difícil. Todos los tutoriales y artículos en línea parecen estar hablando acerca de la 1.0 a la api, que es bastante inútil.

Yo he probado un par de maneras diferentes y obtener resultados diferentes. ¿Qué estoy haciendo mal?

  1. subir tarea – este parece no ser el uso de un formulario multipart, wtf?
    NSMutableURLRequest *request = [self.manager.requestSerializer multipartFormRequestWithMethod:@"POST"
                                                                                      URLString:[[NSURL URLWithString:url relativeToURL:[NSURL URLWithString:ApiBaseUrl]] absoluteString]
                                                                                     parameters:@{}
                                                                      constructingBodyWithBlock:nil];
    
    NSProgress *progress;
    NSURLSessionUploadTask *task = [self.manager uploadTaskWithRequest:request
                                                            fromData:data
                                                            progress:&progress
                                                   completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
                                                     if (error) {
                                                       NSLog(@"[error description] = %@", [error description]);
                                                     } else {
                                                       NSLog(@"success!");
                                                     }
                                                   }];
    
    [task resume];
  2. post con un bloque – esto parece no conecte nada
    [self.manager POST:url
               parameters:@{}
    constructingBodyWithBlock:^(id <AFMultipartFormData> formData) {
        [formData appendPartWithFileData:data
                                    name:@"post[picture]"
                                fileName:@"picture.jpg"
                                mimeType:@"image/jpeg"];
    }
                  success:^(NSURLSessionDataTask *task, id response) {
                    NSLog(@"Success");
                  }
                  failure:^(NSURLSessionDataTask *task, NSError *error) {
                    NSLog(@"Error: %@", error);
                  }];
  3. simple post – esto parece casi trabajo…pero no
    [self.manager POST:url
            parameters:@{@"post[picture][]":data}
               success:^(NSURLSessionDataTask *task, id response) {
                 NSLog(@"Success");
               }
               failure:^(NSURLSessionDataTask *task, NSError *error) {
                 NSLog(@"Error: %@", error);
               }];

Me encantaría 1 para trabajar, pero no estoy seguro de por qué no.

Cuando se utiliza un NSURLSessionUploadTask en el paso 1, donde se obtienen los datos ? Yo estoy haciendo algo similar (aunque no multipart POST) por primera construcción de la solicitud y, a continuación, utilizando la request.HTTPBody como de datos.
has sido capaz de resolver este problema .. yo estoy teniendo el mismo problema .. tengo que enviar los parámetros de la imagen demasiado .. tratado de los tres posibles maneras .. mentiond .. pero nadie está trabajando … no de la muestra es proporcionada por afnetworking demasiado …
has resuelto. Tengo pregunta similar me puede ayudar stackoverflow.com/questions/22180367/…

OriginalEl autor Jeremy Lightsmith | 2013-10-09

2 Comentarios

  1. 14

    Para bien formada “multipart/form-data” cuerpo, usted necesita usar el cuerpo de bloque de construcción, mientras que la creación de la solicitud. De lo contrario, la carga de la tarea es el uso de los datos crudos como el cuerpo. Por ejemplo, en su AFHTTPSessionManager subclase:

    NSString *urlString = [[NSURL URLWithString:kPhotoUploadPath relativeToURL:self.baseURL] absoluteString];
    NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:params constructingBodyWithBlock:^(id <AFMultipartFormData> formData) {
        [formData appendPartWithFileData:photo.data name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
    }];
    
    NSURLSessionUploadTask *task = [self uploadTaskWithStreamedRequest:request progress:progress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
        if (error) {
            if (failure) failure(error);
        } else {
            if (success) success(responseObject);
        }
    }];
    [task resume];

    O, si no la necesidad de realizar un seguimiento de progreso de la carga, usted puede simplemente utilizar:

    [self POST:kPhotoUploadPath parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileData:photo.data name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
    } success:^(NSURLSessionDataTask *task, id responseObject) {
        if (success) success(responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        if (failure) failure(error);
    }];
    Me temo que la primera respuesta es incorrecta, como uploadTaskWithStreamedRequest: es para streaming las solicitudes, es decir, a través de una URL persistente de conexión.
    No creo que es lo que el ‘streaming’ significa en este contexto. Es probable que sólo se refiere al hecho de que es una parte de múltiples formulario de solicitud: w3.org/TR/html401/interact/forms.html#h-17.13.4.2 Mi entendimiento es que el cuerpo de solicitud se transmite, pero la conexión no es persistente y se cierra una vez que se complete la solicitud. Este es el tipo de solicitud para la carga de archivos. uploadTaskWithStreamedRequest: también es utilizado por AFNetworkings ...constructingBodyWithBlock:... métodos.
    pero cuando reviso mi foto.de datos es nulo, se puede buscar en mi pregunta similar, stackoverflow.com/questions/22180367/…

    OriginalEl autor Ray Lillywhite

  2. 5

    Lo que Ray Lillywhite describe funciona perfectamente bien (me he hecho un comentario en su post, pero mi reputación es demasiado baja).

    1. Obtener la versión correcta de AFNetworking, que contiene esta revisión para la actualización de los avances cuando se utiliza en varias partes, las solicitudes de. En el momento de la escritura, que versión es la CABEZA.
    2. Crear un NSMutableURLRequest con la ayuda de multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:.
      • Construir tu formulario de datos con la ayuda de uno de los appendPartWith... métodos.
    3. Conseguir un (upload) los datos de la tarea llamando a la derecha uploadTaskWith... método. Usted NECESIDAD de utilizar uploadTaskWithStreamedRequest:progress:completionHandler: si desea utilizar el NSProgress parámetro de entrada.

    OriginalEl autor Johan Forssell

Dejar respuesta

Please enter your comment!
Please enter your name here