2017-08-02 19 views
0

iOS開發:使用POST網絡請求上傳圖像。iOS開發者:網絡Api問題。如何將圖像數據放入字典中?如何說服服務器?

我使用AFN。通常我們會配置HTTP標頭並將圖像數據放入HTTP正文中。

經過大量的谷歌搜索,仍然沒有意識到它。

服務器JAVA要求圖片數據必須用密鑰上傳。

我遇到了問題。

enter image description here

[formData appendPartWithFileData: imageData name: @"photoFile" fileName:[NSString stringWithFormat:@"%@%@.jpeg",dateString,@(idx)] mimeType:@"image/jpeg"]; 
//the name is the key to the server. 

所以我設置的,服務器的確認,我上傳成功後的圖像數據。

但AFN錯誤:

domain: @"com.alamofire.error.serialization.response"

我試圖修復它,但失敗了。

我處理了AFN中的類型,但它不起作用。

@implementation AFJSONResponseSerializer 
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil]; 

我對服務器瞭解不多,而且被Java工程師弄糊塗了。

我覺得(photoFile)已被明確設置。

PS:如何說服Java工程師,上傳沒有鍵值的圖像。

下面是代碼:

+ (void)startMultiPartUploadTaskWithURL:(NSString *)url 
          imagesArray:(NSArray *)images 
        parameterOfimages:(NSString *)parameter 
         parametersDict:(NSDictionary *)parameters 
         compressionRatio:(float)ratio 
          succeedBlock:(void(^)(id response, NSError *error))succeedBlock 
          failedBlock:(void(^)(id response, NSError *error))failedBlock 
        uploadProgressBlock:(void (^)(float, long long, long long))uploadProgressBlock{ 

    AFHTTPRequestSerializer * requestSerializer = [AFHTTPRequestSerializer serializer ]; 

    [requestSerializer setValue: @"Bearer 933d16fa-8aa8-4c48-a250-62f905276ab7" forHTTPHeaderField:@"Authorization"]; 
    [requestSerializer setValue: @"b6862a23-f60c-4551-adcd-efa845d1511a" forHTTPHeaderField:@"X-Request-ID"]; 

    requestSerializer.timeoutInterval = 120.f; 
    NSMutableURLRequest * request = [requestSerializer multipartFormRequestWithMethod: @"POST" URLString: url parameters: parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { 
     if (images.count > 0) { 
      //generate the image's name 
      NSDate *date = [NSDate date]; 
      NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 
      [formatter setDateFormat:@"yyyyMMddHHmmss"]; 
      NSString *dateString = [formatter stringFromDate:date]; 
      [images enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL * _Nonnull stop) { 
       NSData *imageData; 
       //adjust the imageData size 
       imageData = UIImageJPEGRepresentation(image,ratio); 
       CGFloat sizeOriginKB = imageData.length/1024.0; 
       CGFloat resizeRate = ratio/2.0; 
       //adjust the imageData size , <250Kb 
       while (sizeOriginKB > 250 && resizeRate > 0.01) { 
        imageData = UIImageJPEGRepresentation(image,resizeRate); 
        sizeOriginKB = imageData.length/1024.0; 
        resizeRate = resizeRate/2.0; 
       } 
       [formData appendPartWithFileData:imageData name: @"photoFile" fileName:[NSString stringWithFormat:@"%@%@.jpeg",dateString,@(idx)] mimeType:@"image/jpeg"]; 
      }]; 
     } 
    } error: nil ]; 
    NSURLSessionUploadTask * uploadTask; 
    AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; 
    uploadTask = [manager uploadTaskWithStreamedRequest: request progress:^(NSProgress * _Nonnull uploadProgress) {} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 
     succeedBlock(responseObject, nil); 
     failedBlock(nil, error); 
     //responseObject; 
     //error; 
    } ]; 
    [uploadTask resume ]; 
} 
+0

我不會說服Java工程師,但只是在iOS中解決這個問題,這不是太難。但是爲了幫助我們,我們需要更多的iOS代碼。例如,Objective-C中的整個API調用。 – jbehrens94

+0

已更新。真棒你。沒有更多的垃圾話。 – dengApro

回答

0

的AFN錯誤指示: 「文本/無格式」 錯誤的請求。

與服務器通信以響應JSON而不是字符串後就可以了。

相關問題