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

Posted

技术标签:

【中文标题】尽管上传成功,但调用了 AFNetworking 2.0 POST + PHP 阻止失败【英文标题】:AFNetworking 2.0 POST + PHP block failure called although upload is successful 【发布时间】:2014-01-06 22:30:02 【问题描述】:

我的问题的描述实际上是有问题的标题。我是网络技术的新手,所以这种行为对我来说有点引人注目。图片上传成功,为什么会调用失败块?此外,我在 SoF 上搜索了我的问题的答案并应用了一些解决方案,但仍然出现此错误。如果可能,请提供帮助。提前谢谢你。

目标 - C:

- (void)upload 

    NSString *fileName = [NSString stringWithFormat:@"%ld%c%c.jpg", (long)[[NSDate date] timeIntervalSince1970], arc4random_uniform(26) + 'a', arc4random_uniform(26) + 'a'];
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"jpg"];
    NSData *data = UIImagePNGRepresentation([UIImage imageWithContentsOfFile:imagePath]);

    NSString *URLString = @"http://myServer/myAppFolder";

    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager manager] initWithBaseURL:[NSURL URLWithString:URLString]];

    AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
    [manager setResponseSerializer:responseSerializer];
    [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

    AFHTTPRequestOperation *operation = [manager POST:@"upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
        [formData appendPartWithFileData:data name:@"uploadedfile" fileName:fileName mimeType:@"image/jpeg"];
     success:^(AFHTTPRequestOperation *operation, id responseObject) 
        NSLog(@"Success %@", responseObject);
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        NSLog(@"Failure / %@, /  %@", error, operation.responseString); //error comes from here
    ];

    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) 
        NSLog(@"uploading...");
    ];

上传.php:

<?php
$filename="uploaded";
$target_path = "uploads/";

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
    echo "The file ".  basename( $_FILES['uploadedfile']['name'])." has been uploaded";
 else 
    echo "There was an error uploading the file, please try again!";

?>;

我收到此错误:

Failure / Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x8a633e0 NSDebugDescription=Invalid value around character 0., /  The file 1389046572lb.jpg has been uploaded;

【问题讨论】:

不是 ios 编码器,但您的 The file ... 消息中的“字符 0 周围的值无效”表明 cocoa 期待一些您未发送的其他文本。 你为什么使用AFJSONResponseSerializer?您的 PHP 没有返回 JSON...尝试使用 [AFResponseSerializer serializer]... 我试图在我的 .php 文件中回显由 json_encode 生成的 JSON。但是最后有一个关于垃圾的错误。我意识到在序列化程序中可能会出现问题,尽管不知道 AFHTTPResponseSerializer 这实际上是一个答案。感谢 rokjarc 为我定罪!也感谢 Marc 的回答:-) 不客气。我看到你在我输入答案时解决了这个问题:) 确实是 rokjarc :-) 干杯! 【参考方案1】:

看来问题在于您使用AFJSONResponseSerializer 序列化PHP 上传脚本的响应。

而且您的 PHP 没有返回 JSON - 因此序列化程序会引发错误。

您可以修改 PHP 脚本,使其返回 JSON 格式的结果。或者您可以使用不同类型的序列化程序。

根据this forum 的解决方案是使用[AFResponseSerializer serializer] - 我不确定它是否存在。试试基本的AFHTTPResponseSerializer

【讨论】:

以上是关于尽管上传成功,但调用了 AFNetworking 2.0 POST + PHP 阻止失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 将图像上传到服务器已损坏

应用程序进入后台后未调用 AFNetworking 成功/失败块

AFNetworking 文件上传

在 AFNetworking 重新连接网络时恢复所有上传任务

调用 AFNetworking 响应失败块而不是成功块

afnetworking 多文件上传