0
iOS開發:使用POST網絡請求上傳圖像。iOS開發者:網絡Api問題。如何將圖像數據放入字典中?如何說服服務器?
我使用AFN。通常我們會配置HTTP標頭並將圖像數據放入HTTP正文中。
經過大量的谷歌搜索,仍然沒有意識到它。
服務器JAVA要求圖片數據必須用密鑰上傳。
我遇到了問題。
[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 ];
}
我不會說服Java工程師,但只是在iOS中解決這個問題,這不是太難。但是爲了幫助我們,我們需要更多的iOS代碼。例如,Objective-C中的整個API調用。 – jbehrens94
已更新。真棒你。沒有更多的垃圾話。 – dengApro