第五十三篇、OC利用AFN上传视频到服务器

整体思路已经清楚,拿到视频资源,先转为mp4,写进沙盒,然后上传,上传成功后删除沙盒中的文件。

本地拍摄的视频,上传到服务器:

//视频转换为MP4//转码操作..._hud.mode = MBProgressHUDModeIndeterminate;_hud.labelText = @"转码中...";AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:_filePathURL  options:nil];NSDateFormatter* formater = [[NSDateFormatter alloc] init];[formater setDateFormat:@"yyyyMMddHHmmss"];_fileName = [NSString stringWithFormat:@"output-%@.mp4",[formater stringFromDate:[NSDate date]]];_outfilePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", _fileName];NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality]){MyLog(@"outPath = %@",_outfilePath);AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];exportSession.outputURL = [NSURL fileURLWithPath:_outfilePath];exportSession.outputFileType = AVFileTypeMPEG4;[exportSession exportAsynchronouslyWithCompletionHandler:^{if ([exportSession status] == AVAssetExportSessionStatusCompleted) {MyLog(@"AVAssetExportSessionStatusCompleted---转换成功");_filePath = _outfilePath;_filePathURL = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@",_outfilePath]];MyLog(@"转换完成_filePath = %@\n_filePathURL = %@",_filePath,_filePathURL);//获取大小和长度
                [self SetViewText];[self uploadNetWorkWithParam:@{@"contenttype":@"application/octet-stream",@"discription":description}];}else{MyLog(@"转换失败,值为:%li,可能的原因:%@",(long)[exportSession status],[[exportSession error] localizedDescription]);[_hud hide:YES];[MyHelper showAlertWith:nil txt:@"转换失败,请重试"];}}];}#pragma mark - 开始上传-(void)uploadNetWorkWithParam:(NSDictionary*)dict
{MyLog(@"开始上传_filePath = %@\n_filePathURL = %@",_filePath,_filePathURL);
AFHTTPRequestSerializer *ser=[[AFHTTPRequestSerializer alloc]init];
NSMutableURLRequest *request =
[ser multipartFormRequestWithMethod:@"POST"URLString:[NSString stringWithFormat:@"%@%@",kBaseUrl,kVideoUploadUrl]parameters:@{@"path":@"show",@"key":_key,@"discription":dict[@"discription"],@"isimage":@(_isImage)}constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {[formData appendPartWithFileURL:_filePathURL name:@"file" fileName:_fileName mimeType:dict[@"contenttype"] error:nil];if (!_isImage) {[formData appendPartWithFileURL:_path2Url name:@"tmp" fileName:@"tmp.PNG" mimeType:@"image/png" error:nil];}} error:nil];
//@"image/png"   @"application/octet-stream"  mimeType
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSProgress *progress = nil;
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {if (error) {MyLog(@"request = %@", request );MyLog(@"response = %@", response );MyLog(@"Error: %@", error );[_hud hide:YES];CXAlertView *alert=[[CXAlertView alloc]initWithTitle:NSLocalizedString(@"Warning", nil)message:NSLocalizedString(@"Upload Failed",nil)cancelButtonTitle:NSLocalizedString(@"Iknow", nil)];alert.showBlurBackground = NO;[alert show];} else {MyLog(@"%@ %@", response, responseObject);NSDictionary *backDict=(NSDictionary *)responseObject;if ([backDict[@"success"] boolValue] != NO) {_hud.labelText = NSLocalizedString(@"Updating", nil);[self UpdateResxDateWithDict:backDict discription:dict[@"discription"]];[_hud hide:YES];}else{[_hud hide:YES];[MyHelper showAlertWith:nil txt:backDict[@"msg"]];}}[progress removeObserver:selfforKeyPath:@"fractionCompleted"context:NULL];
}];
[progress addObserver:selfforKeyPath:@"fractionCompleted"options:NSKeyValueObservingOptionNewcontext:NULL];
[progress setUserInfoObject:@"someThing" forKey:@"Y.X."];
[uploadTask resume];}

 

删除沙盒中的视频:

#pragma mark - 清除documents中的视频文件
-(void)ClearMovieFromDoucments{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL];
NSEnumerator *e = [contents objectEnumerator];
NSString *filename;
while ((filename = [e nextObject])) {MyLog(@"%@",filename);if ([filename isEqualToString:@"tmp.PNG"]) {MyLog(@"删除%@",filename);[fileManager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:filename] error:NULL];continue;}if ([[[filename pathExtension] lowercaseString] isEqualToString:@"mp4"]||[[[filename pathExtension] lowercaseString] isEqualToString:@"mov"]||[[[filename pathExtension] lowercaseString] isEqualToString:@"png"]) {MyLog(@"删除%@",filename);[fileManager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:filename] error:NULL];}
}
}

 

转载于:https://www.cnblogs.com/HJQ2016/p/5962813.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlite数据库备份还原、导出导入

1、备份和还原数据库 sqlite> .backup backup.db sqlite> .restore backup.db 2、导出及导入SQL脚本 shell方式&#xff1a; # sqlite3 sqa.db ".dump [mytabl%]" > sqa.sql # sqlite3 sqb.db < sqa.sql 命令行方式&#xff1a; sqlite> .output b…

python程序题斐波那契数列_Python_经典题_斐波那契数列

古典问题&#xff1a;3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月兔子总数是多少&#xff1f;&#xff08;使用循环实现&#xff09; 分析&#xff1a; 第一个月是1对 第二个月还是1对 第三个…

SQLite数据库损坏与修复

&#xfeff;&#xfeff;导致SQLite数据库损坏的情况 导致SQLite数据库损坏的情况大致可归结为4类&#xff1a;文件覆盖问题、文件锁问题、数据同步问题、内存问题文件覆盖问题 SQLite数据库文件被覆盖是可能的&#xff0c;毕竟是一个普通的磁盘文件&#xff0c;意味着所有的…

如何定位Source Generators性能问题

前言在以前的文章中&#xff0c;我们介绍过如何调试Source Generators。但是当实现较为复杂时&#xff0c;我们需要能够快速地分析Source Generators性能的方法。默认情况下&#xff0c;使用VS 2019自带的“性能探查器”不能分析Source Generators项目&#xff0c;因为它是类库…

什么是域(domain)

在今天很多人都有意识或无意识的跟域这个东西打过交道。如果你在公司里使用电脑&#xff0c;并且你的电脑接入了公司的局域网&#xff0c;那你的电脑很可能就在一个域中。如何查看你的电脑是否连接到一个域中&#xff0c;以Windows为例&#xff0c;右击我的电脑 –>属性&…

四舍五入运算

为什么80%的码农都做不了架构师&#xff1f;>>> 请用户输入1个实数(浮点型),请编写算法对这个实数进行四舍五入到个位的运算. 例如 12.56经过四舍五入运算得到13. 而12.45经过四舍五入运算得到12 代码如下地址: http://git.oschina.net/touch1D/qf17j3eughwdp8zxi…

python 新建html_Python学习第226课——html中创建按钮

前面我们学习了一些常见的表单元素&#xff0c;表单就是用来收集用户的信息的&#xff0c;比如调查问卷、用户登录网站的页面等这类的网页&#xff0c;里面都要用到表单元素&#xff0c;当用户在前端页面上填入账号、密码、或者调查问卷的答案等等信息之后&#xff0c;就需要提…

Linux之软连接和硬链接

&#xfeff;&#xfeff;1.Linux链接概念 Linux链接分两种&#xff0c;一种被称为硬链接&#xff08;Hard Link&#xff09;&#xff0c;另一种被称为符号链接&#xff08;Symbolic Link&#xff09;。默认情况下&#xff0c;ln命令产生硬链接。 【硬连接】 硬连接指通过索引…

WPF 实现图片切成九宫格控件~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇倒计时控件01—代码如下一、创建 CropControl.cs代码如下。&#xff08;修改RowColumn “…

使用Visio进行UML建模

资料地址&#xff1a;使用Visio进行UML建模-http://www.qdgw.edu.cn/zhuantiweb/jpkc/2009/rjkf/xmwd/Visio_UmlModel.htm转载于:https://www.cnblogs.com/svennee/p/4075700.html

GCT之数学公式(三角函数)

转载于:https://www.cnblogs.com/jyh317/p/3386598.html

C++基础知识总结(一)

C程序以.cpp作为文件扩展名。 C标准输入输出库的头文件是iostream&#xff0c;在程序中使用&#xff1a;#include <iostream>//包含头文件 C使用命名空间&#xff1a;using namespace std; 对象的定义及初始化&#xff1a;int z(0)//等价int z0&#xff1b; 用关键字cons…

Android安全与逆向之Java虚拟机和Dalvik虚拟机的区别

Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性&#xff0c;Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用&#xff0c;和在低速CPU上表现出的高性能&#xff0c;确实令人刮目相看。 依赖于底层Posix兼容的操作系统&#xff0c;它可以简单的…

软件与硬件我该选哪个_MacBook Air 和 MacBook Pro 该选哪个……?

一个多月前&#xff0c;Apple 发布了 2019 款 MacBook Air 和 MacBook Pro&#xff0c;经过这一次的更新之后&#xff0c;MacBook 产品线总算变得更加清晰了&#xff0c;同时也减少了之前存在的价格和定位产生冲突的现象。不过从购买决策来看&#xff0c;我发现还是有些问题难倒…

只要300页!火遍全网的NET6+linux知识手册!拿走不谢!

这是微软公司基于最新的.net 6编写&#xff0c;循序渐进地对.net6/C#10进行讲解。对于零基础可以作为.net的快速入门教材&#xff0c;对于高级程序员而言&#xff0c;这也是你的进阶之路&#xff01;NO.1资料介绍该手册,全面的介绍.net6和c#的新特性&#xff0c;看完这个资料&a…

Linux0.11内核剖析--内核体系结构

一个完整可用的操作系统主要由 4 部分组成&#xff1a;硬件、操作系统内核、操作系统服务和用户应用程序&#xff0c;如下图所示&#xff1a; 用户应用程序是指那些字处理程序、 Internet 浏览器程序或用户自行编制的各种应用程序&#xff1b; 操作系统服务程序是指那些向用户所…

centos 6安装报错

Missing ISO 9660 imageThe installer has tried to mount image # 1. but cannot find it on the hard drive.Please copy this image to the drive and click Retry. Click Exit to abort the installation. 这个是安装过程中你没有把iso镜像拷贝到你的U盘所导致&#xff01;…

ubuntu上最使用jni最简单易懂的例子

第一步:爆结果照,让你有坚持下去的信心 二、NDK解释 NDK全称:Native Development Kit。 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的m…