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实现视频和图片的上传思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!