关于iOS如何实现视频和图片的上传, 我们先理清下思路,然后小编根据思路一步一步给大家详解实现过程。

思路:
#1. 如何获取图片?
#2. 如何获取视频?
#3. 如何把图片存到缓存路径中?
#4. 如何把视频存到缓存路径中?
#5. 如何上传?
接下来, 我们按照上面的思路一步一步实现
首先我们新建一个类, 用来储存每一个要上传的文件uploadModel.h
#import <Foundation/Foundation.h> @interface uploadModel : NSObject @property (nonatomic, strong) NSString *path; @property (nonatomic, strong) NSString *type; @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) BOOL isUploaded; @end
#1. 如何获取图片?
从相册选择 或者 拍照,
这部分可以用UIImagePickerController来实现
代码如下:
- (void)actionPhoto {
UIAlertController *alertController = \
[UIAlertController alertControllerWithTitle:@""
message:@"上传照片"
preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *photoAction = \
[UIAlertAction actionWithTitle:@"从相册选择"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"从相册选择");
self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
self.imagePicker.mediaTypes = @[(NSString *)kUTTypeImage];
self.imagePicker.allowsEditing = YES;
[self presentViewController:self.imagePicker
animated:YES
completion:nil];
}];
UIAlertAction *cameraAction = \
[UIAlertAction actionWithTitle:@"拍照"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"拍照");
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
self.imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
self.imagePicker.allowsEditing = YES;
[self presentViewController:self.imagePicker
animated:YES
completion:nil];
}
}];
UIAlertAction *cancelAction = \
[UIAlertAction actionWithTitle:@"取消"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"取消");
}];
[alertController addAction:photoAction];
[alertController addAction:cameraAction];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
#2. 如果获取视频?
从相册选择 或者 拍摄
这部分也可以用UIImagePickerController来实现
代码:
- (void)actionVideo {
UIAlertController *alertController = \
[UIAlertController alertControllerWithTitle:@""
message:@"上传视频"
preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *photoAction = \
[UIAlertAction actionWithTitle:@"从视频库选择"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"从视频库选择");
self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
self.imagePicker.mediaTypes = @[(NSString *)kUTTypeMovie];
self.imagePicker.allowsEditing = NO;
[self presentViewController:self.imagePicker animated:YES completion:nil];
}];
UIAlertAction *cameraAction = \
[UIAlertAction actionWithTitle:@"录像"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"录像");
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
self.imagePicker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
self.imagePicker.videoQuality = UIImagePickerControllerQualityType640x480;
self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
self.imagePicker.allowsEditing = YES;
[self presentViewController:self.imagePicker animated:YES completion:nil];
}];
UIAlertAction *cancelAction = \
[UIAlertAction actionWithTitle:@"取消"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"取消");
}];
[alertController addAction:photoAction];
[alertController addAction:cameraAction];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
#3, 关于缓存, 如何把照片存入缓存目录?
这部分我们先考虑缓存目录, 一般存在Document 或者 Temp里面
我们给图片和视频各创建一个缓存目录:
#define PHOTOCACHEPATH [NSTemporaryDirectory() stringByAppendingPathComponent:@"photoCache"] #define VIDEOCACHEPATH [NSTemporaryDirectory() stringByAppendingPathComponent:@"videoCache"]
把UIImage存入缓存的方法:
//将Image保存到缓存路径中
- (void)saveImage:(UIImage *)image toCachePath:(NSString *)path {
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:PHOTOCACHEPATH]) {
NSLog(@"路径不存在, 创建路径");
[fileManager createDirectoryAtPath:PHOTOCACHEPATH
withIntermediateDirectories:YES
attributes:nil
error:nil];
} else {
NSLog(@"路径存在");
}
//[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
[UIImageJPEGRepresentation(image, 1) writeToFile:path atomically:YES];
}
4. 如何把视频存入缓存?
把视频存入缓存的方法:
//将视频保存到缓存路径中
- (void)saveVideoFromPath:(NSString *)videoPath toCachePath:(NSString *)path {
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:VIDEOCACHEPATH]) {
NSLog(@"路径不存在, 创建路径");
[fileManager createDirectoryAtPath:VIDEOCACHEPATH
withIntermediateDirectories:YES
attributes:nil
error:nil];
} else {
NSLog(@"路径存在");
}
NSError *error;
[fileManager copyItemAtPath:videoPath toPath:path error:&error];
if (error) {
NSLog(@"文件保存到缓存失败");
}
}
从缓存获取图片的方法:
//从缓存路径获取照片
- (UIImage *)getImageFromPath:(NSString *)path {
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {
return [UIImage imageWithContentsOfFile:path];
}
return nil;
}
上传图片和视频的时候我们一般会利用当前时间给文件命名, 方法如下
//以当前时间合成图片名称
- (NSString *)getImageNameBaseCurrentTime {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
return [[dateFormatter stringFromDate:[NSDate date]] stringByAppendingString:@".JPG"];
}
//以当前时间合成视频名称
- (NSString *)getVideoNameBaseCurrentTime {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
return [[dateFormatter stringFromDate:[NSDate date]] stringByAppendingString:@".MOV"];
}
有时候需要获取视频的第一帧作为显示, 方法如下:
//获取视频的第一帧截图, 返回UIImage
//需要导入AVFoundation.h
- (UIImage*) getVideoPreViewImageWithPath:(NSURL *)videoPath
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoPath options:nil];
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0.0, 600);
NSError *error = nil;
CMTime actualTime;
CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage *img = [[UIImage alloc] initWithCGImage:image];
return img;
}
5. 如何上传?
下面就是上传方法:
我把服务器地址xx掉了, 大家可以改为自己的
//上传图片和视频
- (void)uploadImageAndMovieBaseModel:(uploadModel *)model {
//获取文件的后缀名
NSString *extension = [model.name componentsSeparatedByString:@"."].lastObject;
//设置mimeType
NSString *mimeType;
if ([model.type isEqualToString:@"image"]) {
mimeType = [NSString stringWithFormat:@"image/%@", extension];
} else {
mimeType = [NSString stringWithFormat:@"video/%@", extension];
}
//创建AFHTTPSessionManager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置响应文件类型为JSON类型
manager.responseSerializer = [AFJSONResponseSerializer serializer];
//初始化requestSerializer
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = nil;
//设置timeout
[manager.requestSerializer setTimeoutInterval:20.0];
//设置请求头类型
[manager.requestSerializer setValue:@"form/data" forHTTPHeaderField:@"Content-Type"];
//设置请求头, 授权码
[manager.requestSerializer setValue:@"YgAhCMxEehT4N/DmhKkA/M0npN3KO0X8PMrNl17+hogw944GDGpzvypteMemdWb9nlzz7mk1jBa/0fpOtxeZUA==" forHTTPHeaderField:@"Authentication"];
//上传服务器接口
NSString *url = [NSString stringWithFormat:@"http://xxxxx.xxxx.xxx.xx.x"];
//开始上传
[manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
NSError *error;
BOOL success = [formData appendPartWithFileURL:[NSURL fileURLWithPath:model.path] name:model.name fileName:model.name mimeType:mimeType error:&error];
if (!success) {
NSLog(@"appendPartWithFileURL error: %@", error);
}
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上传进度: %f", uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"成功返回: %@", responseObject);
model.isUploaded = YES;
[self.uploadedArray addObject:model];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上传失败: %@", error);
model.isUploaded = NO;
}];
}
这里有事先创建两个可变数组uploadArray, uploadedArray, 一个存放准要上传的内容, 一个存放上传完的内容
在准备上传后做什么操作, 可以检查两个数组的数量是否相等
最后是UIImagePickerController的协议方法
#pragma mark - UIImagePickerDelegate methods
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
[picker dismissViewControllerAnimated:YES completion:nil];
//获取用户选择或拍摄的是照片还是视频
NSString *mediaType = info[UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
//获取编辑后的照片
NSLog(@"获取编辑后的好片");
UIImage *tempImage = info[UIImagePickerControllerEditedImage];
//将照片存入相册
if (tempImage) {
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
//将照片存入相册
NSLog(@"将照片存入相册");
UIImageWriteToSavedPhotosAlbum(tempImage, self, nil, nil);
}
//获取图片名称
NSLog(@"获取图片名称");
NSString *imageName = [self getImageNameBaseCurrentTime];
NSLog(@"图片名称: %@", imageName);
//将图片存入缓存
NSLog(@"将图片写入缓存");
[self saveImage:tempImage
toCachePath:[PHOTOCACHEPATH stringByAppendingPathComponent:imageName]];
//创建uploadModel
NSLog(@"创建model");
uploadModel *model = [[uploadModel alloc] init];
model.path = [PHOTOCACHEPATH stringByAppendingPathComponent:imageName];
model.name = imageName;
model.type = @"image";
model.isUploaded = NO;
//将模型存入待上传数组
NSLog(@"将Model存入待上传数组");
[self.uploadArray addObject:model];
}
}
else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
//如果是拍摄的视频, 则把视频保存在系统多媒体库中
NSLog(@"video path: %@", info[UIImagePickerControllerMediaURL]);
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:info[UIImagePickerControllerMediaURL] completionBlock:^(NSURL *assetURL, NSError *error) {
if (!error) {
NSLog(@"视频保存成功");
} else {
NSLog(@"视频保存失败");
}
}];
}
//生成视频名称
NSString *mediaName = [self getVideoNameBaseCurrentTime];
NSLog(@"mediaName: %@", mediaName);
//将视频存入缓存
NSLog(@"将视频存入缓存");
[self saveVideoFromPath:info[UIImagePickerControllerMediaURL] toCachePath:[VIDEOCACHEPATH stringByAppendingPathComponent:mediaName]];
//创建uploadmodel
uploadModel *model = [[uploadModel alloc] init];
model.path = [VIDEOCACHEPATH stringByAppendingPathComponent:mediaName];
model.name = mediaName;
model.type = @"moive";
model.isUploaded = NO;
//将model存入待上传数组
[self.uploadArray addObject:model];
}
//[picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:nil];
}
以上所述是小编给大家介绍的iOS实现视频和图片的上传思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# ios实现视频上传
# ios实现图片上传
# iOS开发之获取系统相册中的图片与视频教程(内带url转换)
# IOS实现视频动画效果的启动图
# 浅析iOS中视频播放的几种方案
# iOS视频录制(或选择)压缩及上传功能(整理)
# iOS仿微信相机拍照、视频录制功能
# 详解iOS应用中播放本地视频以及选取本地音频的组件用法
# iOS中视频播放器的简单封装详解
# iOS中读取照片库及保存图片或视频到照片库的要点解析
# iOS 本地视频和网络视频流播放实例代码
# iOS视频中断后台音乐播放的处理方法
# 上传
# 这部
# 小编
# 可以用
# 给大家
# 不存在
# 来实现
# 上传图片
# 自己的
# 方法如下
# 的是
# 在此
# 做什么
# 我把
# 掉了
# 所述
# 创建一个
# 给我留言
# 感谢大家
# 如何实现
相关文章:
黑客入侵网站服务器的常见手法有哪些?
如何在香港服务器上快速搭建免备案网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
如何在七牛云存储上搭建网站并设置自定义域名?
如何彻底删除建站之星生成的Banner?
代购小票制作网站有哪些,购物小票的简要说明?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何在阿里云服务器自主搭建网站?
如何通过商城免费建站系统源码自定义网站主题?
盐城做公司网站,江苏电子版退休证办理流程?
网站微信制作软件,如何制作微信链接?
网站制作网站,深圳做网站哪家比较好?
C++时间戳转换成日期时间的步骤和示例代码
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
如何在阿里云完成域名注册与建站?
活动邀请函制作网站有哪些,活动邀请函文案?
c++怎么用jemalloc c++替换默认内存分配器【性能】
C++用Dijkstra(迪杰斯特拉)算法求最短路径
头像制作网站在线制作软件,dw网页背景图像怎么设置?
内网网站制作软件,内网的网站如何发布到外网?
建站OpenVZ教程与优化策略:配置指南与性能提升
香港网站服务器数量如何影响SEO优化效果?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何快速查询网址的建站时间与历史轨迹?
建站之星安装后如何自定义网站颜色与字体?
浅谈Javascript中的Label语句
如何高效利用亚马逊云主机搭建企业网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
广州美橙建站如何快速搭建多端合一网站?
如何在搬瓦工VPS快速搭建网站?
如何用景安虚拟主机手机版绑定域名建站?
如何在阿里云虚拟服务器快速搭建网站?
北京的网站制作公司有哪些,哪个视频网站最好?
如何用PHP快速搭建高效网站?分步指南
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
淘宝制作网站有哪些,淘宝网官网主页?
javascript基本数据类型及类型检测常用方法小结
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何快速建站并高效导出源代码?
焦点电影公司作品,电影焦点结局是什么?
做企业网站制作流程,企业网站制作基本流程有哪些?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
魔方云NAT建站如何实现端口转发?
如何快速搭建响应式可视化网站?
建站之星如何通过成品分离优化网站效率?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
建站之星后台管理系统如何操作?
*请认真填写需求信息,我们会在24小时内与您取得联系。