整体思路已经清楚,拿到视频资源,先转为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:self
forKeyPath:@"fractionCompleted"
context:NULL];
}];
[progress addObserver:self
forKeyPath:@"fractionCompleted"
options:NSKeyValueObservingOptionNew
context: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:];
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];
}
}
}

第五十三篇、OC利用AFN上传视频到服务器的更多相关文章

  1. 第五十四篇、OC利用AFN上传上传语音

    如果不是NSData就要想办法把语音文件转化为NSData,然后才能上传服务器. 首先我们拿到语音文件对应的NSData对象 NSData *voiceData = [message valueFor ...

  2. 《手把手教你》系列技巧篇(五十三)-java+ selenium自动化测试-上传文件-上篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

  3. 利用 AFN 上传相册或拍照图片

    概述 自定义上传图片请求,自定义调取相册及拍照,方便多处使用时调用. 详细 代码下载:http://www.demodashi.com/demo/10718.html 由于项目中多处需要上传图片,我们 ...

  4. 利用bootstrap上传视频文件,mvc做后台处理

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  5. WPF上传文件到服务器

    利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...

  6. 利用SecureCRT上传、下载文件(使用sz与rz命令),超实用!

    利用SecureCRT上传.下载文件(使用sz与rz命令),超实用! 文章来源:http://blog.csdn.net/dongqinliuzi/article/details/39623169 借 ...

  7. php 利用socket上传文件

    php 利用socket上传文件 张映 发表于 2010-06-02 分类目录: php 一,利用fsockopen来上传文件 以前我写过一篇关于socket通信原理的博文http://blog.51 ...

  8. 2.6 利用FTP上传所有文件

    利用FTP上传所有文件 import os,ftptools class UploadAll(ftptools.FtpTools): #继承上一篇写的Ftptools '''upload an ent ...

  9. SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET

    SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET SAE利用storge上传文件

随机推荐

  1. servlet--页面自刷新

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  2. mount nfs的可选参数

    mount nfs的可选参数:HARD mount和SOFT MOUNT:HARD:NFS CLIENT会不断的尝试与SERVER的连接(在后台,不会给出任何提示信息,在LINUX下有的版本仍然会给出 ...

  3. Linux下通过JDBC连接Oracle,SqlServer和PostgreSQL

    今天正好需要统计三个网站栏目信息更新情况,而这三个网站的后台采用了不同的数据库管理系统.初步想法是通过建立一个小的Tomcat webapp,进而通过JDBC访问这三个后台数据库,并根据返回的数据生成 ...

  4. 一个无聊的实验:验证网站是否通过web容器还是微服务部署

    一般来说一台web服务器会部署多个实例(且共享80端口),举个栗子例如nginx通常部署多个站点,每个站点都有自己的端口 例如 8091,8092之类的. 通过nginx进行代理.(前提微服务直接使用 ...

  5. hibernate+mysql 8小时问题

    在生产环境中使用了 自带的连接池 结果 遇到 mysql8小时问题 然后 采用了 c3p0 连接池 hibernate 版本 4.3.6 c3p0版本 0.9.5-pre10 ps:hibernate ...

  6. Codeforces Gym 100610 Problem H. Horrible Truth 瞎搞

    Problem H. Horrible Truth Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1006 ...

  7. 进程和cpu的相关知识和简单调优方案

    进程就是一段执行的程序,每当一个程序执行时.对于操作系统本身来说,就创建了一个进程,而且分配了相应的资源.进程能够分为3个类别:     1.交互式进程(I/O)     2.批处理进程 (CPU) ...

  8. Linux堆内存管理深入分析

    (上半部) 作者:走位@阿里聚安全 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较 ...

  9. Qt之遍历文件夹

    关于Qt操作文件夹.文件的知识用途较多,比如遍历下一层乃至所有子孙文件.文件夹,获取它们的一些信息(大小.类型.最后更改时间等).当然,也可以进行级联删除.     首先看简单的:   一.Qt遍历文 ...

  10. Python实践之(七)逻辑回归(Logistic Regression)

    机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Pyth ...