最近在忙著開發(fā)公司的一個(gè)項(xiàng)目,中間遇到很多坑,對(duì)于圖片的上傳在這里我也不做太多的介紹,網(wǎng)上各種大神的資料都有的,今天我主要說(shuō)一下我再上傳圖片和文字的時(shí)候遇到的一些坑(圖文上傳我們很多時(shí)候都會(huì)遇到,遇到多了網(wǎng)上找的各種博客,解決了圖文一起上傳的問(wèn)題)廢話不多說(shuō),直接上代碼:
/** * 上傳圖文 */ -----(void)upLoadImageViewToServiceWithIconImage:(UIImage *)image{ //1. 利用時(shí)間戳當(dāng)做圖片名字 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMddHHmmss"; NSString *imageName = [formatter stringFromDate:[NSDate date]]; NSString *fileName = [NSString stringWithFormat:@"%@.jpg",imageName]; //2. 圖片二進(jìn)制文件 NSData *imageData = UIImageJPEGRepresentation(image, 0.7f); NSLog(@"upload image size: %ld k", (long)(imageData.length / 1024)); //3. 發(fā)起網(wǎng)絡(luò)請(qǐng)求 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"application/json", @"text/html", nil]; AFHTTPRequestSerializer *request = [AFJSONRequestSerializer serializer]; NSDictionary *params = @{@"imageType":CJUserIconImageType}; if (params != nil) { for (NSString *httpHeaderField in params.allKeys) { NSString *value = params[httpHeaderField]; [request setValue:value forHTTPHeaderField:httpHeaderField]; } } manager.requestSerializer = request; [manager POST:CJUploadImageBaseURL parameters:nil constructingBodyWithBlock:^(id_Nonnull formData) {
// 上傳圖片,以文件流的格式,這里注意:name是指服務(wù)器端的文件夾名字
[formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpeg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
// [SVProgressHUD showProgress:uploadProgress.fractionCompleted];
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
CJLog(@"%@", responseObject);
// 提交完圖片之后 上傳信息
NSString *code = [responseObject objectForKey:@"code"];
if ([code integerValue] == 0000) {
self.iconImageURL = [[responseObject objectForKey:@"data"] objectForKey:CJUploadImageBackImagepath];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
CJLog(@"%@", error);
}];
}
、、、
上面的是整個(gè)的上傳方法,一下是分開分析一下如何上傳圖片和文字的問(wèn)題
圖片在上傳到服務(wù)器的時(shí)候一般都是以二進(jìn)制流的形式提交的,為了以后用戶量增大避免不必要的麻煩,圖片的名字隨機(jī)定義下,我這里是根據(jù)時(shí)間戳來(lái)命名的
、、、
//1. 利用時(shí)間戳當(dāng)做圖片名字
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *imageName = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.jpg",imageName];
、、、
把圖片轉(zhuǎn)成二進(jìn)制文件 根據(jù)你們你們公司要求圖片格式,也可以是png格式的
、、、
//2. 圖片二進(jìn)制文件
NSData *imageData = UIImageJPEGRepresentation(image, 0.7f);
、、、
* 在發(fā)起提交的時(shí)候,我這里網(wǎng)絡(luò)請(qǐng)求用的是AFN (強(qiáng)大的AFN),這里設(shè)置一下請(qǐng)求頭,把我們所需要上傳的文字信息放在請(qǐng)求頭里面,圖片的二進(jìn)制文件放在請(qǐng)求體里面,跟你們后臺(tái)API人員溝通好,確定好文件的字段,不然字段不統(tǒng)一,就坑了。。
、、、
//3. 發(fā)起網(wǎng)絡(luò)請(qǐng)求
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"application/json", @"text/html", nil];
AFHTTPRequestSerializer *request = [AFJSONRequestSerializer serializer];
NSDictionary *params = @{@"imageType":CJUserIconImageType}; if (params != nil) { for (NSString *httpHeaderField in params.allKeys) {
NSString *value = params[httpHeaderField];
[request setValue:value forHTTPHeaderField:httpHeaderField]; }
}
manager.requestSerializer = request;
[manager POST:CJUploadImageBaseURL parameters:nil constructingBodyWithBlock:^(id_Nonnull formData) {
// 上傳圖片,以文件流的格式,這里注意:name是指服務(wù)器端的文件夾名字
[formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpeg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
// [SVProgressHUD showProgress:uploadProgress.fractionCompleted];
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
CJLog(@"%@", responseObject);
// 提交完圖片之后 上傳信息
NSString *code = [responseObject objectForKey:@"code"];
if ([code integerValue] == 0000) {
self.iconImageURL = [[responseObject objectForKey:@"data"] objectForKey:CJUploadImageBackImagepath];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
CJLog(@"%@", error);
}];
上面params就是文本所對(duì)應(yīng)的字段了,我們這里是只設(shè)置了圖片的類型,其實(shí)主要是跟你們公司后臺(tái)溝通好,API 類型一致就不會(huì)出問(wèn)題
如果代碼沒(méi)有copy錯(cuò)的話,換一下里面的字段就可以用的,好了,第一次發(fā)簡(jiǎn)書,先到這里吧,歡迎各位大神指正。