項目中需要上傳多張圖片,并且嵌套多層圖片數(shù)組上傳,看了AF的底層還有網(wǎng)上的一些Post請求,復(fù)習(xí)了下系統(tǒng)的請求類,上傳圖片就是將圖片轉(zhuǎn)化成二進制流然后放入HTTPBody中發(fā)送到服務(wù)器,如果是嵌套,只需要注重name屬性對應(yīng)即可,name即為key,廢話不多說,下面開始上代碼
AFHTTPSessionManager *manager = [NetWorkingHelper createAFHTTPSessionManager];
[manager POST:@"postURL"parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//壓縮-添加-上傳圖片
//遍歷你的第一層圖片請求數(shù)組
[self.imagesArr enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) {
//壓縮圖片轉(zhuǎn)化為data,第一個參數(shù)是圖片,第二個參數(shù)是壓縮系數(shù)
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
//添加轉(zhuǎn)化后的data到body中
//data:轉(zhuǎn)化后的imageData
//name:服務(wù)器需要的標(biāo)識,服務(wù)器根據(jù)這個來取圖片流,類似parameters里面的key
//fileName:服務(wù)器保存的圖片名字,base64加密后更佳 (如有不對歡迎指出 )
//mimeType:圖片類型,一般為@"image/jpeg"固定格式,特殊可添加其他格式
[formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"image[%ld]",idx] fileName:[NSString stringWithFormat:@"%@%lu.jpeg",@"planImage",(unsigned long)idx]mimeType:@"image/jpeg"];
}];
//這里上傳嵌套的圖片,比如你請求類第一層里面有數(shù)組包含第二層,第二層里面有圖片數(shù)組或依次類推,都只需按對應(yīng)的name(key)來上傳即可,如圖片需要綁定其他參數(shù)要轉(zhuǎn)化成data放在這里面一起上傳
[self.imageArray enumerateObjectsUsingBlock:^(NSArray* _Nonnull obj, NSUInteger idxs, BOOL * _Nonnull stop) {
//壓縮-添加-上傳圖片
[self.imageArray[idxs] enumerateObjectsUsingBlock:^( UIImage*_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSData *imageData = UIImageJPEGRepresentation(obj, 1.0);
[formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"list[%ld].images[%ld].image",idxs,idx] fileName:[NSString stringWithFormat:@ "%@%lu.jpeg",@"picDTOImage",(unsigned long)idx]mimeType:@"image/jpeg"];
NSData *strData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
[formData appendPartWithFormData:strData name:[NSString stringWithFormat:@"list[%ld].images[%ld].type",idxs,idx]];
}];
}];
} progress:^(NSProgress * _Nonnull uploadProgress) {
//上傳進度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];