iOS实现视频和图片的上传思路
关于iOS如何实现视频和图片的上传,我们先理清下思路,然后小编根据思路一步一步给大家详解实现过程。
思路:
#1.如何获取图片?
#2.如何获取视频?
#3.如何把图片存到缓存路径中?
#4.如何把视频存到缓存路径中?
#5.如何上传?
接下来,我们按照上面的思路一步一步实现
首先我们新建一个类,用来储存每一个要上传的文件uploadModel.h
#import@interfaceuploadModel:NSObject @property(nonatomic,strong)NSString*path; @property(nonatomic,strong)NSString*type; @property(nonatomic,strong)NSString*name; @property(nonatomic,assign)BOOLisUploaded; @end
#1.如何获取图片?
从相册选择或者拍照,
这部分可以用UIImagePickerController来实现
代码如下:
-(void)actionPhoto{ UIAlertController*alertController=\ [UIAlertControlleralertControllerWithTitle:@"" message:@"上传照片" preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction*photoAction=\ [UIAlertActionactionWithTitle:@"从相册选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction*_Nonnullaction){ NSLog(@"从相册选择"); self.imagePicker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; self.imagePicker.mediaTypes=@[(NSString*)kUTTypeImage]; self.imagePicker.allowsEditing=YES; [selfpresentViewController:self.imagePicker animated:YES completion:nil]; }]; UIAlertAction*cameraAction=\ [UIAlertActionactionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction*_Nonnullaction){ NSLog(@"拍照"); if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ self.imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; self.imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto; self.imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear; self.imagePicker.allowsEditing=YES; [selfpresentViewController:self.imagePicker animated:YES completion:nil]; } }]; UIAlertAction*cancelAction=\ [UIAlertActionactionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction*_Nonnullaction){ NSLog(@"取消"); }]; [alertControlleraddAction:photoAction]; [alertControlleraddAction:cameraAction]; [alertControlleraddAction:cancelAction]; [selfpresentViewController:alertControlleranimated:YEScompletion:nil]; }
#2.如果获取视频?
从相册选择或者拍摄
这部分也可以用UIImagePickerController来实现
代码:
-(void)actionVideo{ UIAlertController*alertController=\ [UIAlertControlleralertControllerWithTitle:@"" message:@"上传视频" preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction*photoAction=\ [UIAlertActionactionWithTitle:@"从视频库选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction*_Nonnullaction){ NSLog(@"从视频库选择"); self.imagePicker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; self.imagePicker.mediaTypes=@[(NSString*)kUTTypeMovie]; self.imagePicker.allowsEditing=NO; [selfpresentViewController:self.imagePickeranimated:YEScompletion:nil]; }]; UIAlertAction*cameraAction=\ [UIAlertActionactionWithTitle:@"录像" style:UIAlertActionStyleDefault handler:^(UIAlertAction*_Nonnullaction){ NSLog(@"录像"); self.imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; self.imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear; self.imagePicker.mediaTypes=[UIImagePickerControlleravailableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; self.imagePicker.videoQuality=UIImagePickerControllerQualityType640x480; self.imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo; self.imagePicker.allowsEditing=YES; [selfpresentViewController:self.imagePickeranimated:YEScompletion:nil]; }]; UIAlertAction*cancelAction=\ [UIAlertActionactionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction*_Nonnullaction){ NSLog(@"取消"); }]; [alertControlleraddAction:photoAction]; [alertControlleraddAction:cameraAction]; [alertControlleraddAction:cancelAction]; [selfpresentViewController:alertControlleranimated:YEScompletion:nil]; }
#3,关于缓存,如何把照片存入缓存目录?
这部分我们先考虑缓存目录,一般存在Document或者Temp里面
我们给图片和视频各创建一个缓存目录:
#definePHOTOCACHEPATH[NSTemporaryDirectory()stringByAppendingPathComponent:@"photoCache"] #defineVIDEOCACHEPATH[NSTemporaryDirectory()stringByAppendingPathComponent:@"videoCache"]
把UIImage存入缓存的方法:
//将Image保存到缓存路径中 -(void)saveImage:(UIImage*)imagetoCachePath:(NSString*)path{ NSFileManager*fileManager=[NSFileManagerdefaultManager]; if(![fileManagerfileExistsAtPath:PHOTOCACHEPATH]){ NSLog(@"路径不存在,创建路径"); [fileManagercreateDirectoryAtPath:PHOTOCACHEPATH withIntermediateDirectories:YES attributes:nil error:nil]; }else{ NSLog(@"路径存在"); } //[UIImagePNGRepresentation(image)writeToFile:pathatomically:YES]; [UIImageJPEGRepresentation(image,1)writeToFile:pathatomically:YES]; }
4.如何把视频存入缓存?
把视频存入缓存的方法:
//将视频保存到缓存路径中 -(void)saveVideoFromPath:(NSString*)videoPathtoCachePath:(NSString*)path{ NSFileManager*fileManager=[NSFileManagerdefaultManager]; if(![fileManagerfileExistsAtPath:VIDEOCACHEPATH]){ NSLog(@"路径不存在,创建路径"); [fileManagercreateDirectoryAtPath:VIDEOCACHEPATH withIntermediateDirectories:YES attributes:nil error:nil]; }else{ NSLog(@"路径存在"); } NSError*error; [fileManagercopyItemAtPath:videoPathtoPath:patherror:&error]; if(error){ NSLog(@"文件保存到缓存失败"); } }
从缓存获取图片的方法:
//从缓存路径获取照片 -(UIImage*)getImageFromPath:(NSString*)path{ NSFileManager*fileManager=[NSFileManagerdefaultManager]; if([fileManagerfileExistsAtPath:path]){ return[UIImageimageWithContentsOfFile:path]; } returnnil; }
上传图片和视频的时候我们一般会利用当前时间给文件命名,方法如下
//以当前时间合成图片名称 -(NSString*)getImageNameBaseCurrentTime{ NSDateFormatter*dateFormatter=[[NSDateFormatteralloc]init]; [dateFormattersetDateFormat:@"yyyy-MM-ddHH-mm-ss"]; return[[dateFormatterstringFromDate:[NSDatedate]]stringByAppendingString:@".JPG"]; } //以当前时间合成视频名称 -(NSString*)getVideoNameBaseCurrentTime{ NSDateFormatter*dateFormatter=[[NSDateFormatteralloc]init]; [dateFormattersetDateFormat:@"yyyy-MM-ddHH-mm-ss"]; return[[dateFormatterstringFromDate:[NSDatedate]]stringByAppendingString:@".MOV"]; }
有时候需要获取视频的第一帧作为显示,方法如下:
//获取视频的第一帧截图,返回UIImage //需要导入AVFoundation.h -(UIImage*)getVideoPreViewImageWithPath:(NSURL*)videoPath { AVURLAsset*asset=[[AVURLAssetalloc]initWithURL:videoPathoptions:nil]; AVAssetImageGenerator*gen=[[AVAssetImageGeneratoralloc]initWithAsset:asset]; gen.appliesPreferredTrackTransform=YES; CMTimetime=CMTimeMakeWithSeconds(0.0,600); NSError*error=nil; CMTimeactualTime; CGImageRefimage=[gencopyCGImageAtTime:timeactualTime:&actualTimeerror:&error]; UIImage*img=[[UIImagealloc]initWithCGImage:image]; returnimg; }
5.如何上传?
下面就是上传方法:
我把服务器地址xx掉了,大家可以改为自己的
//上传图片和视频 -(void)uploadImageAndMovieBaseModel:(uploadModel*)model{ //获取文件的后缀名 NSString*extension=[model.namecomponentsSeparatedByString:@"."].lastObject; //设置mimeType NSString*mimeType; if([model.typeisEqualToString:@"image"]){ mimeType=[NSStringstringWithFormat:@"image/%@",extension]; }else{ mimeType=[NSStringstringWithFormat:@"video/%@",extension]; } //创建AFHTTPSessionManager AFHTTPSessionManager*manager=[AFHTTPSessionManagermanager]; //设置响应文件类型为JSON类型 manager.responseSerializer=[AFJSONResponseSerializerserializer]; //初始化requestSerializer manager.requestSerializer=[AFHTTPRequestSerializerserializer]; manager.responseSerializer.acceptableContentTypes=nil; //设置timeout [manager.requestSerializersetTimeoutInterval:20.0]; //设置请求头类型 [manager.requestSerializersetValue:@"form/data"forHTTPHeaderField:@"Content-Type"]; //设置请求头,授权码 [manager.requestSerializersetValue:@"YgAhCMxEehT4N/DmhKkA/M0npN3KO0X8PMrNl17+hogw944GDGpzvypteMemdWb9nlzz7mk1jBa/0fpOtxeZUA=="forHTTPHeaderField:@"Authentication"]; //上传服务器接口 NSString*url=[NSStringstringWithFormat:@"http://xxxxx.xxxx.xxx.xx.x"]; //开始上传 [managerPOST:urlparameters:nilconstructingBodyWithBlock:^(id_NonnullformData){ NSError*error; BOOLsuccess=[formDataappendPartWithFileURL:[NSURLfileURLWithPath:model.path]name:model.namefileName:model.namemimeType:mimeTypeerror:&error]; if(!success){ NSLog(@"appendPartWithFileURLerror:%@",error); } }progress:^(NSProgress*_NonnulluploadProgress){ NSLog(@"上传进度:%f",uploadProgress.fractionCompleted); }success:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject){ NSLog(@"成功返回:%@",responseObject); model.isUploaded=YES; [self.uploadedArrayaddObject:model]; }failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror){ NSLog(@"上传失败:%@",error); model.isUploaded=NO; }]; }
这里有事先创建两个可变数组uploadArray,uploadedArray,一个存放准要上传的内容,一个存放上传完的内容
在准备上传后做什么操作,可以检查两个数组的数量是否相等
最后是UIImagePickerController的协议方法
#pragmamark-UIImagePickerDelegatemethods -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info{ [pickerdismissViewControllerAnimated:YEScompletion:nil]; //获取用户选择或拍摄的是照片还是视频 NSString*mediaType=info[UIImagePickerControllerMediaType]; if([mediaTypeisEqualToString:(NSString*)kUTTypeImage]){ //获取编辑后的照片 NSLog(@"获取编辑后的好片"); UIImage*tempImage=info[UIImagePickerControllerEditedImage]; //将照片存入相册 if(tempImage){ if(picker.sourceType==UIImagePickerControllerSourceTypeCamera){ //将照片存入相册 NSLog(@"将照片存入相册"); UIImageWriteToSavedPhotosAlbum(tempImage,self,nil,nil); } //获取图片名称 NSLog(@"获取图片名称"); NSString*imageName=[selfgetImageNameBaseCurrentTime]; NSLog(@"图片名称:%@",imageName); //将图片存入缓存 NSLog(@"将图片写入缓存"); [selfsaveImage:tempImage toCachePath:[PHOTOCACHEPATHstringByAppendingPathComponent:imageName]]; //创建uploadModel NSLog(@"创建model"); uploadModel*model=[[uploadModelalloc]init]; model.path=[PHOTOCACHEPATHstringByAppendingPathComponent:imageName]; model.name=imageName; model.type=@"image"; model.isUploaded=NO; //将模型存入待上传数组 NSLog(@"将Model存入待上传数组"); [self.uploadArrayaddObject:model]; } } elseif([mediaTypeisEqualToString:(NSString*)kUTTypeMovie]){ if(picker.sourceType==UIImagePickerControllerSourceTypeCamera){ //如果是拍摄的视频,则把视频保存在系统多媒体库中 NSLog(@"videopath:%@",info[UIImagePickerControllerMediaURL]); ALAssetsLibrary*library=[[ALAssetsLibraryalloc]init]; [librarywriteVideoAtPathToSavedPhotosAlbum:info[UIImagePickerControllerMediaURL]completionBlock:^(NSURL*assetURL,NSError*error){ if(!error){ NSLog(@"视频保存成功"); }else{ NSLog(@"视频保存失败"); } }]; } //生成视频名称 NSString*mediaName=[selfgetVideoNameBaseCurrentTime]; NSLog(@"mediaName:%@",mediaName); //将视频存入缓存 NSLog(@"将视频存入缓存"); [selfsaveVideoFromPath:info[UIImagePickerControllerMediaURL]toCachePath:[VIDEOCACHEPATHstringByAppendingPathComponent:mediaName]]; //创建uploadmodel uploadModel*model=[[uploadModelalloc]init]; model.path=[VIDEOCACHEPATHstringByAppendingPathComponent:mediaName]; model.name=mediaName; model.type=@"moive"; model.isUploaded=NO; //将model存入待上传数组 [self.uploadArrayaddObject:model]; } //[pickerdismissViewControllerAnimated:YEScompletion:nil]; } -(void)imagePickerControllerDidCancel:(UIImagePickerController*)picker{ [pickerdismissViewControllerAnimated:YEScompletion:nil]; }
以上所述是小编给大家介绍的iOS实现视频和图片的上传思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!