今天项目需要刚好要用到图片上传功能,谷歌了两天终于成功把图片上传到后台。作为一个iOS开发渣渣入门者,查看了很多大神的博客写的太厉害实在是搞不懂,各个参数都意义都理解了半天,故把自己的一段代码分享上来,希望能帮到和我一样的初学者。
直接上代码
- (void)someViewController:(SomeViewController *)someViewController sendToAnotherVCWithName:(NSString *)name andIDNum:(NSString *)idNum {
NSLog(@"名字:%@ 和身份证号:%@", name, idNum);
// ----------------------------上传图片----
/*
此段代码如果需要修改,可以调整的位置
1. 把upload.php改成网站开发人员告知的地址
2. 把name改成网站开发人员告知的字段名
*/
// 查询条件
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:name, @"name", idNum, @"idNumber", nil];
// 基于AFN3.0+ 封装的HTPPSession句柄
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 20;
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];
// 在parameters里存放照片以外的对象
[manager POST:@"http://www.example.com/Project/upload.php" parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体
// 这里的_photoArr是你存放图片的数组
for (int i = 0; i < _photosArr.count; i++) {
UIImage *image = _photosArr[i];
NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
// 要解决此问题,
// 可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 设置时间格式
[formatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateString = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString];
/*
*该方法的参数
1. appendPartWithFileData:要上传的照片[二进制流]
2. name:对应网站上[upload.php中]处理文件的字段(比如upload)
3. fileName:要保存在服务器上的文件名
4. mimeType:上传的文件的类型
*/
[formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; //
}
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"---上传进度--- %@",uploadProgress);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"```上传成功``` %@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"xxx上传失败xxx %@", error);
}];
}
代码直接复制可用
相关: XCode 7.3.1 AFNetworking 3.1.0