使用Objective C将图像上传到PHP服务器


Upload an Image Using Objective C to a PHP Server

我正在开发一个iphone应用程序,并使用POST请求,我已经阅读了许多关于同一主题的文章,但仍然无法工作,我将感谢一些帮助,这是我的代码:

         //turning the image into a NSData object
         //getting the image back out of the UIImageView
         //setting the quality to 72
        NSData *image_data = UIImageJPEGRepresentation(picture, 72);
        // setting up the URL to post to
        NSMutableString *urlString = [[NSMutableString alloc] init];
        [urlString appendString:BASE_URL];
        [urlString appendString:@"mobile_services/mobile_store_services/upload_wishlist_image/"];
        //[urlString appendString:@"/temp_trash/temporal.php"];
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
        [request setHTTPShouldHandleCookies:NO];
        [request setTimeoutInterval:30];
        [request setURL:[NSURL URLWithString:urlString]];
        [request setHTTPMethod:@"POST"];
        NSMutableData *body = [NSMutableData data];
        NSString *boundary = @"---------------------------14737809831466499882746641449";
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
        [request addValue:contentType forHTTPHeaderField:@"Content-Type"];
        // file
        [body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name='"userfile'"; filename='"test.jpg'"'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[@"Content-Transfer-Encoding: binary'r'n'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:image_data];
        [body appendData:[[NSString stringWithFormat:@"'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
        // Text parameter1
        NSString *param1 = @"parameter text";
        [body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name='"texto_prueba'"'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:param1] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[@"'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
        // close form
        [body appendData:[[NSString stringWithFormat:@"--%@--'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        // set request body
        [request setHTTPBody:body];
        NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        if(conn){
            web_data = [NSMutableData data];
        }else{
            NSLog(@"doesn't exist");
        }

我使用的是NSURLConnectionDataDelegate协议,因此,我收到了以下方法中的数据:

    -(void) connectionDidFinishLoading:(NSURLConnection *)connection
    {
        //NSArray *json_data = [NSJSONSerialization JSONObjectWithData:web_data         options:kNilOptions error:NULL];
        NSString *returningString = [[NSString alloc] initWithData:web_data encoding:NSUTF8StringEncoding];
        NSLog(@"returned string = %@", returningString);
        [loadingView stopLoading];
    }

我的PHP方面,只告诉我,它以这种方式收到了什么:

    public function upload_wishlist_image()
    {
        var_dump($_REQUEST);
    }

请帮忙!,PHP没有接收到任何图像数据。

看起来您已经放弃了这种技术,转而使用base64。我不怪你,因为手动创建这些请求很麻烦。将来,如果您使用AFNetworking来提出请求,生活会轻松得多。

无论如何,如果您对代码不起作用的原因感兴趣,那么第一个问题就是NSMutableURLRequest。它非常非常接近,尽管有几个观察结果:

  1. 您应该使用该文件的mime类型(在本例中为image/jpeg),如果您不知道该文件的mime类型,则仅使用application/octet-stream。所以你应该去掉application/octet-stream行。

  2. 除最后一行外,应在二进制数据之前的每行末尾使用'r'n

所以,不是:

[body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name='"userfile'"; filename='"test.jpg'"'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary'r'n'r'n" dataUsingEncoding:NSUTF8StringEncoding]];

你应该有:

[body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name='"userfile'"; filename='"test.jpg'"'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary'r'n'r'n" dataUsingEncoding:NSUTF8StringEncoding]];

其次,一旦修复了请求,PHP $_REQUEST变量应该只包含'texto_prueba' => 'parameter text'。如果你没有看到这一点,那么我会质疑你是如何从URL映射到PHP函数的。

但是,就你上传的图像而言,你在$_REQUEST中找不到。userfile参数将由$_FILES返回,而不是由$_REQUEST返回。

另一个,最后的观察:你正在通过UIImageJPEGRepresentation将你的图像转换回NSData。如果您可以获取NSData(通过dataWithContentsOfFile),这可能比往返UIImage并返回NSData要好,这将导致图像退化和元数据丢失。