最近在做一个人脸识别考勤系统的时候,遇到了需要同时上传学生学号和学生照片到服务器的需求。因为要根据学生学号和学生照片来判断是否为本人,所有这两个数据不能分开上传到服务器,必须得同时上传。所有我们用到了AFNetworking的AFMultiparFormData来传输数据。下面是程序的关键代码:
//上传头像图片到服务器
-(void) postImageToServer
{
_manager = [AFHTTPSessionManager manager] ;
_manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:
@"application/json",
@"text/html" ,
@"image/jpeg" ,
@"image/png" ,
@"image/jpg" ,
@"application/octet-stream",
@"text/json" ,
nil] ;
_manager.requestSerializer = [AFHTTPRequestSerializer serializer ] ;
_manager.responseSerializer = [AFHTTPResponseSerializer serializer] ;
[_manager POST:@"http://192.168.31.244:8080/ImageUploadServer/uploadimage" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData)
{
//上传学生学号到服务器
//_strStudentId为学生学号字符串
NSData *data = [_strStudentId dataUsingEncoding:NSUTF8StringEncoding] ;
[formData appendPartWithFormData:data name:@"studentId"] ;
//在网络开发中,上传文件时,文件是不允许被覆盖,文件重名
//要解决此问题,可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
//设置时间格式
formatter.dateFormat = @"yyyyMMddHHmmss" ;
NSString *str = [formatter stringFromDate:[NSDate date]] ;
NSString *fileName = [NSString stringWithFormat:@"%@.jpeg",str] ;
//压缩图片
//_imageEdit是从相机获取的图片
NSData *imageData = UIImageJPEGRepresentation(_imageEdit, 0.1) ;
//上传图片到服务器
[formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpeg"] ;
}
//上传过程中调用
progress:^(NSProgress * _Nonnull uploadProgress)
{
}
//上传成功调用
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
{
NSLog(@"上传成功!") ;
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
{
NSLog(@"上传失败") ;
}] ;
}