使用AFnetworking以多部分格式上传图像在ios中不起作用

Posted

技术标签:

【中文标题】使用AFnetworking以多部分格式上传图像在ios中不起作用【英文标题】:Image upload in multipart format using AFnetworking not working in ios 【发布时间】:2014-10-24 12:47:29 【问题描述】:
    AFHTTPSessionManager 用于从 ios 应用发布文件 服务端使用php实现 如果文件是从 Web 服务器发送的,则服务器接受文件

我的 iOS 代码是

UIImage *image = [UIImage imageNamed:@"Fb-button"];

NSData *imageData = UIImagePNGRepresentation(image);

AFHTTPSessionManager *sessionManager  = [[AFHTTPSessionManager alloc]initWithBaseURL:@"baseurl"];

AFJSONResponseSerializer *jsonresponseSerilaizer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

jsonresponseSerilaizer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/plain",@"text/html", nil];

sessionManager.responseSerializer = jsonresponseSerilaizer ;

[sessionManager POST:@"pathurl" parameters:Nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 

    [formData appendPartWithFileData: imageData name:@"userfile" fileName:@"userfile.png" mimeType:@"png"];

 success:^(NSURLSessionDataTask *task, id responseObject) 

    NSLog(@"success");

    NSLog(@"response : %@",responseObject);

 failure:^(NSURLSessionDataTask *task, NSError *error) 

    NSLog(@"error");

    NSLog(@"error : %@",error);

];

我在 xcode 中得到的错误是 cocoa error 3840

error : Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x79865f70 NSDebugDescription=Invalid value around character 0., NSUnderlyingError=0x798665c0 "Request failed: bad request (400)"

PHP代码如下

$user_image              =   $_FILES['user_image']['name'];
$config['upload_path']   = './images/User_files/';
$config['allowed_types'] = 'gif|jpg|png';
$config['file_name']     = $user_image;
$config['max_size']      = '100';
$config['max_width']     = '1024';
$config['max_height']    = '768';

$this->load->library('upload', $config);

if ( ! $this->upload->do_upload())

    $data["error"] = array('error' => $this->upload->display_errors());

    echo json_encode($data);

else

    $data = array('upload_data' => $this->upload->data());

    echo '"success": "true"';

我还尝试了以下 php 代码:

if($_FILES['user_image']['size'] > 0) 

    $user_image = substr(number_format(time() * rand(), 0, '', ''), 0, 8);

    if (preg_match('/^image\/p?jpeg$/i', $_FILES['user_image']['type']) or 
        preg_match('/^image\/gif$/i', $_FILES['user_image']['type']) or 
        preg_match('/^image\/jpg$/i', $_FILES['user_image']['type']) or 
        preg_match('/^image\/(x-)?png$/i', $_FILES['user_image']['type'])) 
     
        if (preg_match('/^image\/p?jpeg$/i', $_FILES['user_image']['type'])) 
         
            $ext = '.jpg'; 
         
        else if (preg_match('/^image\/gif$/i', $_FILES['user_image']['type']))
         
            $ext = '.gif'; 
        
        else if (preg_match('/^image\/jpg$/i', $_FILES['user_image']['type']))
         
            $ext = '.jpg'; 
         
        else if (preg_match('/^image\/(x-)?png$/i', $_FILES['user_image']['type'])) 
         
            $ext = '.png'; 
        

        $user_image = $user_image.$ext;
        $user_imagetoStore = './images/User_files/'.$user_image;
        copy($_FILES['user_image']['tmp_name'],$user_imagetoStore);
    
    else
    
        $user_image= "";
    

【问题讨论】:

【参考方案1】:

一些想法:

    Objective-C 代码使用名为userfile 的字段,PHP sn-ps 使用user_image

    第二个 PHP 代码 sn -p 不生成任何 JSON 响应。

    我也建议简单:

    sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    

    这可能没关系,但当你调用POST 方法时,我也会使用nil 而不是Nil

    如果上述方法不起作用,我还建议在模拟器上运行它并在 Charles (http://charlesproxy.com) 中观察它,看看请求是否正常。

【讨论】:

以上是关于使用AFnetworking以多部分格式上传图像在ios中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何以多部分形式将画布图像上传到 java servlet?

使用 AFNetworking 从 ios 中的照片库上传图像?

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

一次可以将多少张图像上传到 AFNetworking [关闭]

UIPregressView 使用 AFNetWorking 上传图像

使用 AFNetworking 2.0 上传进度