AFNetworking HTTP POST 上传图像在接近完成时停止

Posted

技术标签:

【中文标题】AFNetworking HTTP POST 上传图像在接近完成时停止【英文标题】:AFNetworking HTTP POST upload image stopping when near completion 【发布时间】:2013-04-17 10:08:26 【问题描述】:

我正在使用下面的代码来 HTTP POST 一个包含 JPEG 图像的多部分 Web 表单。

代码:

NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
[params setObject:nameField.text forKey:@"name"];
[params setObject:emailField.text forKey:@"email"];
[params setObject:titleField.text forKey:@"title"];
[params setObject:dateString forKey:@"link"];
[params setObject:descriptionTV.text forKey:@"content"];
[params setObject:tag forKey:@"tags"];

NSData* sendData = UIImageJPEGRepresentation(uploadedPhoto.image, 1.0);
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://example.com/"]];
NSMutableURLRequest *afRequest = [httpClient multipartFormRequestWithMethod:@"POST"
                                                                       path:@"form"
                                                                 parameters:params
                                                  constructingBodyWithBlock:^(id <AFMultipartFormData>formData)
                                  
                                      [formData appendPartWithFileData:sendData
                                                                  name:@"image"
                                                              fileName:@"image.jpeg"
                                                              mimeType:@"image/jpeg"];
                                  ];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) 

    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"SUCCESS! %@", operation.responseString);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"FAILED!!! %@", operation.responseString);
];

[operation start];

网络表单:

<input type="text" name="name" id="name" value="" />
<input type="text" name="email" id="email" value="" />
<input type="text" name="title" id="title" value="" />
<input type="text" name="link" id="link" value="" />
<input type="text" name="content" id="content" value="" />
<input type="text" name="tags" id="tags" value="" />
<input type="file" name="image" id="image" value="" />

每次我运行代码时,图像上传都很顺利,直到上传进度即将完成(约 99.5% 完成)。该操作的 completionBlockWithSuccess:failure: 块永远不会启动,应用程序只是在那里冻结。

谁能帮我解决这个问题?我不知道我在这里做错了什么。

编辑:

我进行了更多调查,发现即使请求路径无效,它也会执行相同的操作,但我很确定我没有输入错误的表单路径。另外,当我用nil 替换constructingBodyWithBlock 块时,它会正常工作。

编辑 2:

我在 AFNetworking 的 Github 上做了一些窥探,发现了 a Github issue post 和 a similar post on Stack Overflow。我尝试使用 [httpClient enqueueHTTPRequestOperation:operation]; 而不是 [operation start]; 并使 httpClient 成为单例,但同样的问题仍然存在。

【问题讨论】:

您好,您找到解决方案了吗?请帮忙。 @ScarletWitch 对不起,我没有。 【参考方案1】:

您是否尝试在失败回调中打印NSError?也许服务器正在等待另一种 mime 类型。

【讨论】:

如果我没记错的话,它只是返回网页的源代码(类似于在网络浏览器中查看页面源代码)。 您是否在服务器端代码中返回了有效的 JSON?在我看来,这不是 AFNetworking 问题,而是服务器端问题。 不幸的是,我无法控制 Web 后端。我还预感到这是服务器端的问题,因此我的合作伙伴正在将后端系统更改为更好的文档记录。 @Jay,尝试使用cURL 模拟 AFNetworking 调用,并检查您是否收到了有效的 JSON。如果不是,则说明您遇到了服务器端问题。

以上是关于AFNetworking HTTP POST 上传图像在接近完成时停止的主要内容,如果未能解决你的问题,请参考以下文章

尽管上传成功,但调用了 AFNetworking 2.0 POST + PHP 阻止失败

如何从 AFNETWORKING POST 获取参数

AFNetworking 2.0 HTTP POST 进展

AFNetworking POST 写入服务器并返回失败错误(Cocoa 错误 3840)

无法在 AFNetworking POST 请求上设置 HTTP 正文

AFNetworking 2.0 多部分请求正文空白