AFNetworking上传iOS图片到API

7

我遇到了上传带有图像数据的问题。以下代码可以正常上传数据:

    NSURL *url = [NSURL URLWithString:@"my_base_url"];
AFHTTPClient *client = [[AFHTTPClient alloc]initWithBaseURL:url];

//depending on what kind of response you expect.. change it if you expect XML
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];

NSDictionary *params = [[NSDictionary alloc]initWithObjectsAndKeys:
                        _topicText.text,@"Topic",
                        @"1",@"Category",
                        @"",@"MainMedia",
                        @"1",@"Creator",
                        nil];
[client postPath:@"apidebate/debates" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    //

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"failure");
}];

然而,我在尝试使用该数据上传图像时一直不成功:

    NSURL *url = [NSURL URLWithString:@"my_base_url"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"MainMedia"], 0.5);
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
    [formData appendPartWithFileData:imageData name:@"MainMedia" fileName:@"MainMedia" mimeType:@"image/jpeg"];
}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];
[operation start];

我到底做错了什么??

编辑(添加服务器代码)

后端是Codeigniter,使用了Phil Sturgeon编写的REST客户端(非常好用的库,顺便说一下)。虽然我几乎可以确定不是服务器代码的问题,因为该方法的第一行会向我发送一封电子邮件。但当我尝试使用上述代码上传图片时,我收不到任何电子邮件。因此,似乎它甚至还没有到达终点。

//CONTROLLER FROM API
function debates_post()
{
    mail('myemailaddress@gmail.com', 'Test', 'Posted');
    $tmp_dir = "images/posted/";

    if(isset($_FILES['MainMedia'])){
        $SaniFileName = preg_replace('/[^a-zA-Z0-9-_\.]/','', basename($_FILES['MainMedia']['name']));

        $file = $tmp_dir . $SaniFileName;
        move_uploaded_file($_FILES['MainMedia']['tmp_name'], $file);
    }
    else
        $SaniFileName = NULL;

    $data = array('Topic'=>$this->post('Topic'), 'MainMedia'=>$this->post('MainMedia'), 'Category'=>$this->post('Category'), 'Creator'=>$this->post('Creator'));
    $insert = $this->debate->post_debate($this->post('Topic'), $SaniFileName, $this->post('Category'), $this->post('Creator'));
    if($insert){
        $message = $this->db->insert_id();
    }
    else{
        $message = 'Insert failed';
    }

    $this->response($message, 200);
}

//MODEL
function post_debate($Topic=NULL, $MainMedia='', $Category=NULL, $Creator=NULL){
    $MainMedia = ($MainMedia)?$MainMedia:'';
    $data = array(
                    'Topic' => $Topic,
                    'MainMedia' => $MainMedia,
                    'Category' => $Category,
                    'Creator' => $Creator,
                    'Created' => date('Y-m-d h:i:s')
                );
    return $this->db->insert('debate_table', $data);
}

尝试使用[httpClient enqueueHTTPRequestOperation:operation]代替[operation start] - Felix
好的,我已经这样做了,结果是一样的:数据似乎被应用程序上传(我能够在“setUploadProgressBlock”中访问“totalBytesWritten”),但它似乎从未到达我的终点。这是我列出的第二种方法,尝试上传图像。端点是正确的,因为当不尝试上传图像时,我能够命中它。帮忙吗? - d2burke
问题似乎出在服务器上。你能发布相关的服务器代码吗? - Felix
1个回答

4

好的,显然使用fileName:@"MainMedia"作为文件名导致上传的文件没有扩展名,这会在服务器端引起错误。在"MainMedia.jpg"后添加".jpg"可以解决此问题。


它确实有帮助,但这是我第一次这样做,因为我认为将扩展发送到服务器端不是一个好的做法。 - amar
此外,使用 .PNG 图像时,只需要文件名即可。任何其他图像格式都需要文件扩展名。 - d2burke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接