簡體   English   中英

使用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沒有收到任何圖像數據。

看來您已經放棄了該技術,並轉換為64基。我不怪您,因為手動創建這些請求很麻煩。 將來,如果您使用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 如果可以(通過dataWithContentsOfFile )獲取NSData ,可能比通過UIImage其往返並返回NSData更好,這將導致圖像質量下降和元數據丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM