2016-11-28 80 views
1

我正在尋找一些導致我的問題。 我已經實際瀏覽了所有與發佈/上傳圖片到服務器相關的鏈接,但似乎沒有任何東西讓我的代碼工作。發佈帶有參數的圖像 - AFNetworking 3.1和目標c(Xcode 8)

我已經發布了2個選項......以不同的方式...評論代碼表明...我的請求對服務器空白。

我試過使用不同的選項 - appendPartWithFormData,appendPartWithFileData。

選項1

NSError * error;

// Create paths to output images 
    NSString *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.png"]; 
    UIImage *image = [UIImage imageWithData:self.imageData]; 
    [UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES]; 
    NSURL *imagePath = [NSURL fileURLWithPath:pngPath]; 

    NSData *jsonInputData  = [NSJSONSerialization dataWithJSONObject:[requestParameter valueForKey:@"Param"] options:0 error:&error]; 
    NSString *jsonInputString = [[NSString alloc] initWithData:jsonInputData encoding:NSUTF8StringEncoding]; 

    NSLog(@"converted JOSN Data %@",jsonInputString); 

    NSDictionary* params = @{@"request": jsonInputString }; 

    [manager POST:[requestParameter valueForKey:@"methodName"] parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
    { 
     //[formData appendPartWithFormData:self.imageData name:@"profilepic" ]; 

     //[formData appendPartWithFileData:self.imageData name:@"profilepic" fileName:@"profilepic.png" mimeType:@"image/png"]; 
     [formData appendPartWithFormData:jsonInputData name:@"request"]; 
     [formData appendPartWithFileURL:[NSURL fileURLWithPath:pngPath] 
            name:@"File" 
            error:nil]; 
    } progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"Success: %@", responseObject); 
     [self requestSuccessed:responseObject]; 

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

     NSLog(@"Error: %@", error); 
     [self requestFailed:error]; 
    }]; 

OPTION 2

NSError* error; 

    NSData *jsonInputData  = [NSJSONSerialization dataWithJSONObject:[requestParameter valueForKey:@"Param"] options:0 error:&error]; 
    NSString *jsonInputString = [[NSString alloc] initWithData:jsonInputData encoding:NSUTF8StringEncoding]; 
    NSDictionary* params = @{@"request": jsonInputString }; 

    AFURLSessionManager *manager1 = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

    NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:[NSString stringWithFormat:@「XXXXXXX」] parameters:nil error:nil]; 


    req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue]; 
    // [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    // [req setHTTPBody:[jsonInputString dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSMutableData *body = [NSMutableData data]; 
    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Disposition: form-data; name=\"profile_pic\"; filename=\"pic.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:self.imageData]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [req addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"request\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:jsonInputString] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

    // close form 
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [req setHTTPBody:body]; 

    [[manager1 dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

     if (!error) { 
      NSLog(@"Reply JSON: %@", responseObject); 

      if ([responseObject isKindOfClass:[NSDictionary class]]) { 
       //blah blah 
      } 
     } else { 
      NSLog(@"Error: %@, %@, %@", error, response, responseObject); 
     } 
    }] resume]; 
+0

我想你會需要某種形式的服務器端REST API的(PHP,Perl中,Node.js的,等等)聽到通話後,實際保存文件。最終使用某種形式的認證。 – Alex

+0

感謝亞歷克斯..服務器是用Java實現的,當我從Postmanplugin發佈相同的請求..與附加的PNG文件..在formdata - 請求順利,我得到了一個成功的迴應。 – Vijaya

回答

0

試試這個,希望這將解決您的問題

 // your parametes here 
    userInfoDict=[[NSMutableDictionary alloc] init]; 

    [userInfoDict setValue:@"image" forKey:@"iamge"]; 

    // if image is too large than the timeout intervel 
// [_request setTimeoutInterval:1000]; 

    _request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"api url" parameters:userInfoDict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
       { 
       //convert imahe into data 
        NSData* data = UIImagePNGRepresentation(yourImage); 

        [formData appendPartWithFileData:data name:@"api paramets name in which you want to post image" fileName:@"myImage.png" mimeType:@"image/png"]; 

       } error:nil]; 

    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

    _uploadTask = [manager 
        uploadTaskWithStreamedRequest:_request 
        progress:^(NSProgress * _Nonnull uploadProgress) 

        { 
         // This is not called back on the main queue. 
         // You are responsible for dispatching to the main queue for UI updates 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          //Update the progress view 
          [_playerProgress setProgress:uploadProgress.fractionCompleted]; 

          NSLog(@"\n uploading image vlaues %f\n",uploadProgress.fractionCompleted); 

          // for uploading video in background 
          manager.attemptsToRecreateUploadTasksForBackgroundSessions=YES; 

         }); 
        } 

        completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 
         if (error) { 
          NSLog(@"Error: %@", error); 

          // [_playerProgress setHidden:YES]; 

         } else 
         { 
          NSLog(@"%@ ", response); 

          // after upload comnlete disablle background uploading 

          manager.attemptsToRecreateUploadTasksForBackgroundSessions=NO; 

          NSLog(@"\n\n REsponse Form Server %@\n\n",responseObject); 
          //[responseObject valueForKey:@"error"]; 
                  //remove temp file 
          NSError *error; 

         } 
        } 

        ]; 

    [_uploadTask resume]; 
+0

Thanks Nouman ...嘗試了你的解決方案,但沒有幫助...請求變成空白 – Vijaya

+0

@Vijaya我更新了代碼,如果你有時間可以試試這個,這也適用於我。 –

+0

再次感謝Nouman ......從jpeg轉到png,我也嘗試過了,我仍然繼續使用您的代碼來確保..我可能錯過了別的東西..但是沒有運氣。 – Vijaya

0

這通常爲我工作。您需要確保您的RESTful腳本選取正確的文件句柄。我不知道Java的,但在PHP中我會做如下:$image = $_FILES["imagename"]["name"];

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    NSLog(@"Saving image file"); 

    [formData appendPartWithFileData:UIImagePNGRepresentation(image) name:@"imagename" fileName:@"image.png" mimeType:@"image/png"]; 

} error:nil]; 

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:^(NSProgress * _Nonnull uploadProgress) { 
    // This is not called back on the main queue. 
    // You are responsible for dispatching to the main queue for UI updates 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"JSON uploadProgress.fractionCompleted: %f", uploadProgress.fractionCompleted); 
    }); 
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

    //NSLog(@"Error: %@", error); 
    NSLog(@"RESPONSE: %@ %@", response, responseObject); 
    if(error) { 
     NSLog(@"Error: %@", error); 

    } else { 
     NSString *responseString = [[[NSString alloc] initWithData:responseObject encoding:NSASCIIStringEncoding] mutableCopy]; 
     NSLog(@"RESPONSE: %@", responseString); 
    } 
}]; 
[uploadTask resume]; 
+0

感謝亞歷克斯...這對我來說不起作用...我對服務器沒有太多想法,但是從android應用程序 - 字節數組正在被髮送用於映像,服務器將其選中。 .. – Vijaya