#import "ViewController.h"
#import "AFNetworking.h" @interface ViewController () @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self download];
} -(void)download
{
//1.创建会话管理者
AFHTTPSessionManager *manager =[AFHTTPSessionManager manager]; NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; //2.下载文件
/*
第一个参数:请求对象
第二个参数:progress 进度回调 downloadProgress
第三个参数:destination 回调(目标位置)
有返回值
targetPath:临时文件路径
response:响应头信息
第四个参数:completionHandler 下载完成之后的回调
filePath:最终的文件路径
*/ /*
第一个参数:请求对象
第二个参数:进度回调
downloadProgress.completedUnitCount :已经下载的数据
downloadProgress.totalUnitCount:数据的总大小
第三个参数:destination回调,该block需要返回值(NSURL类型),告诉系统应该把文件剪切到什么地方
targetPath:文件的临时保存路径tmp,随时可能被删除
response:响应头信息
第四个参数:completionHandler请求完成后回调
response:响应头信息
filePath:文件的保存路径,即destination回调的返回值
error:错误信息
*/
NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { //监听下载进度
//completedUnitCount 已经下载的数据大小
//totalUnitCount 文件数据的中大小
NSLog(@"%f",1.0 *downloadProgress.completedUnitCount / downloadProgress.totalUnitCount); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
/**
* 1:1:请求路径:NSUrl *url = [NSUrl urlWithString:path];从网络请求路径 2:把本地的file文件路径转成url,NSUrl *url = [NSURL fileURLWithPath:fullPath];
2:返回值是一个下载文件的路径
*
*/
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename]; NSLog(@"targetPath:%@",targetPath);
NSLog(@"fullPath:%@",fullPath); return [NSURL fileURLWithPath:fullPath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
/**
*filePath:下载后文件的保存路径
*/
NSLog(@"%@",filePath);
}]; //3.执行Task
[download resume];
} @end

(2)使用AFN下载文件

```objc

-(void)download

{

//1.创建会话管理者

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//2.创建请求对象

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_13.png"]];

//3.创建下载Task

/*

第一个参数:请求对象

第二个参数:进度回调

downloadProgress.completedUnitCount :已经下载的数据

downloadProgress.totalUnitCount:数据的总大小

第三个参数:destination回调,该block需要返回值(NSURL类型),告诉系统应该把文件剪切到什么地方

targetPath:文件的临时保存路径

response:响应头信息

第四个参数:completionHandler请求完成后回调

response:响应头信息

filePath:文件的保存路径,即destination回调的返回值

error:错误信息

*/

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {

NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);

} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];

NSLog(@"%@\n%@",targetPath,fullPath);

return [NSURL fileURLWithPath:fullPath];

} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

NSLog(@"%@",filePath);

}];

//4.执行Task

[downloadTask resume];

}

```

二:文件上传

#import "ViewController.h"
#import "AFNetworking.h" #define Kboundary @"----WebKitFormBoundaryjv0UfA04ED44AhWx" #define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding] @interface ViewController () @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self upload2];
} //不推荐
-(void)upload
{
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //2.1url
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"]; //2.2创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //2.3 设置请求方法
request.HTTPMethod = @"POST"; //2.4 设请求头信息
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"]; //3.发送请求上传文件
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromData:[self getBodyData] progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"%f",1.0 * uploadProgress.completedUnitCount/ uploadProgress.totalUnitCount); } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { NSLog(@"%@",responseObject);
}]; //4.执行task
[uploadTask resume];
} -(void)upload2
{
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // NSDictionary *dictM = @{}
//2.发送post请求上传文件
/*
第一个参数:请求路径
第二个参数:字典(非文件参数)
第三个参数:constructingBodyWithBlock 处理要上传的文件数据
第四个参数:进度回调
第五个参数:成功回调 responseObject:响应体信息
第六个参数:失败回调
*/
[manager POST:@"http://120.25.226.186:32812/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { /**
* 1:将image转换成NSData:可用 UIImagePNGRepresentation,也可用UIImageJPEGRepresentation
2:data转换成image:UIImage *image = [UIImage imageWithData:data];
3:url:1;网络路径:NSUrl urlWithString 2:NSUrl fileUrlWithStr:本地文件路径
4:第三种方法:没有传fileName 和 mimeType,由AFN内部去自动设置,fileName截取的文件的url路径,mimeType由c语言内部去获取
*/
UIImage *image = [UIImage imageNamed:@"Snip20160227_128"];
NSData *imageData = UIImagePNGRepresentation(image); //使用formData来拼接数据
/*
第一个参数:二进制数据 要上传的文件参数
第二个参数:服务器规定的
第三个参数:该文件上传到服务器以什么名称保存
*/
//[formData appendPartWithFileData:imageData name:@"file" fileName:@"xxxx.png" mimeType:@"image/png"]; //[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/Snip20160227_128.png"] name:@"file" fileName:@"123.png" mimeType:@"image/png" error:nil]; [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/Snip20160227_128.png"] name:@"file" error:nil]; } progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"%f",1.0 * uploadProgress.completedUnitCount/uploadProgress.totalUnitCount); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上传成功---%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上传失败---%@",error);
}]; }
-(NSData *)getBodyData
{
NSMutableData *fileData = [NSMutableData data];
//5.1 文件参数
/*
--分隔符
Content-Disposition: form-data; name="file"; filename="Snip20160225_341.png"
Content-Type: image/png(MIMEType:大类型/小类型)
空行
文件参数
*/
[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
[fileData appendData:KNewLine]; //name:file 服务器规定的参数
//filename:Snip20160225_341.png 文件保存到服务器上面的名称
//Content-Type:文件的类型
[fileData appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"Sss.png\"" dataUsingEncoding:NSUTF8StringEncoding]];
[fileData appendData:KNewLine];
[fileData appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
[fileData appendData:KNewLine];
[fileData appendData:KNewLine]; UIImage *image = [UIImage imageNamed:@"Snip20160227_128"];
//UIImage --->NSData
NSData *imageData = UIImagePNGRepresentation(image);
[fileData appendData:imageData];
[fileData appendData:KNewLine]; //5.2 非文件参数
/*
--分隔符
Content-Disposition: form-data; name="username"
空行
123456
*/
[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
[fileData appendData:KNewLine];
[fileData appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
[fileData appendData:KNewLine];
[fileData appendData:KNewLine];
[fileData appendData:[@"" dataUsingEncoding:NSUTF8StringEncoding]];
[fileData appendData:KNewLine]; //5.3 结尾标识
/*
--分隔符--
*/
[fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
return fileData;
} @end

###2.AFN文件上传

```objc

1.文件上传拼接数据的第一种方式

[formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];

2.文件上传拼接数据的第二种方式

[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];

3.文件上传拼接数据的第三种方式

[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];

4.【注】在资料中已经提供了一个用于文件上传的分类。

/*文件上传相关的代码如下*/

-(void)upload1

{

//1.创建会话管理者

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//2.处理参数(非文件参数)

NSDictionary *dict = @{

@"username":@"123"

};

//3.发送请求上传文件

/*

第一个参数:请求路径(NSString类型)

第二个参数:非文件参数,以字典的方式传递

第三个参数:constructingBodyWithBlock 在该回调中拼接文件参数

第四个参数:progress 进度回调

uploadProgress.completedUnitCount:已经上传的数据大小

uploadProgress.totalUnitCount:数据的总大小

第五个参数:success 请求成功的回调

task:上传Task

responseObject:服务器返回的响应体信息(已经以JSON的方式转换为OC对象)

第六个参数:failure 请求失败的回调

task:上传Task

error:错误信息

*/

[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

UIImage *image = [UIImage imageNamed:@"Snip20160117_1"];

NSData *imageData = UIImagePNGRepresentation(image);

//在该block中拼接要上传的文件参数

/*

第一个参数:要上传的文件二进制数据

第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的(通常会在接口文档中提供)

第三个参数:该文件上传到服务后以什么名称保存

第四个参数:该文件的MIMeType类型

*/

[formData appendPartWithFileData:imageData name:@"file" fileName:@"123.png" mimeType:@"image/png"];

} progress:^(NSProgress * _Nonnull uploadProgress) {

NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

NSLog(@"请求成功----%@",responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

NSLog(@"请求失败----%@",error);

}];

}

-(void)upload2

{

//1.创建会话管理者

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//2.处理参数(非文件参数)

NSDictionary *dict = @{

@"username":@"123"

};

//3.发送请求上传文件

/*

第一个参数:请求路径(NSString类型)

第二个参数:非文件参数,以字典的方式传递

第三个参数:constructingBodyWithBlock 在该回调中拼接文件参数

第四个参数:progress 进度回调

uploadProgress.completedUnitCount:已经上传的数据大小

uploadProgress.totalUnitCount:数据的总大小

第五个参数:success 请求成功的回调

task:上传Task

responseObject:服务器返回的响应体信息(已经以JSON的方式转换为OC对象)

第六个参数:failure 请求失败的回调

task:上传Task

error:错误信息

*/

[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/文顶顶/Desktop/Snip20160117_1.png"];

//在该block中拼接要上传的文件参数

//第一种拼接方法

/*

第一个参数:要上传的文件的URL路径

第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的(通常会在接口文档中提供)

第三个参数:该文件上传到服务后以什么名称保存

第四个参数:该文件的MIMeType类型

第五个参数:错误信息,传地址

*/

//[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"1234.png" mimeType:@"image/png" error:nil];

//第二种拼接方法:简写方法

/*

第一个参数:要上传的文件的URL路径

第二个参数:文件参数对应的参数名称,此处为file

第三个参数:错误信息

说明:AFN内部自动获得路径URL地址的最后一个节点作为文件的名称,内部调用C语言的API获得文件的类型

*/

[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];

} progress:^(NSProgress * _Nonnull uploadProgress) {

NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

NSLog(@"请求成功----%@",responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

NSLog(@"请求失败----%@",error);

}];

}

```

iOS开发AFN使用二:AFN文件下载与文件上传的更多相关文章

  1. iOS开发之网络编程--使用NSURLConnection实现文件上传

    前言:使用NSURLConnection实现文件上传有点繁琐.    本文并没有介绍使用第三方框架上传文件. 正文: 这里先提供用于编码测试的接口:http://120.25.226.186:3281 ...

  2. iOS开发之结合asp.net webservice实现文件上传下载

    iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下使用asp.net webservice实现文件上传下载. 首先,让我们看下文件下载. 这里我们下载cnblogs上的一个zip文件.使用N ...

  3. ios开发网络学习五:输出流以及文件上传

    一:输出流 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelega ...

  4. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  5. JavaEE系列之(二)commons-fileupload实现文件上传、下载

    一.文件上传概述     实现Web开发中的文件上传功能,需要两步操作:     1.在Web页面中添加上传输入项 <form action="#" method=" ...

  6. SpringMVC系列(十一)把后台返回的数据转换成json、文件下载、文件上传

    一.后台返回的数据转换成json 1.引入转换json需要的3个依赖 <!--json转换需要的依赖 begin --> <dependency> <groupId> ...

  7. 前端开发之旅- 移动端HTML5实现文件上传

    一. 在一个客户的webapp项目中需要用到 html5调用手机摄像头,找了很多资料,大都是 js调用api  然后怎样怎样,做了几个demo测试发现根本不行, 后来恍然大悟,用html5自带的 in ...

  8. ios开发网络学习十二:NSURLSession实现文件上传

    #import "ViewController.h" // ----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @&q ...

  9. [SAP ABAP开发技术总结]客户端文本文件、Excel文件上传下载

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. 算法导论——lec 12 平摊分析与优先队列

    在平摊分析中,运行一系列数据结构操作所须要的时间是通过对运行的全部操作求平均得出.反映在不论什么情况下(即最坏情况下),每一个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方 ...

  2. 72.挖掘CSDN密码到链表并统计密码出现次数生成密码库

    list.h #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include & ...

  3. 一个小的考试系统 android 思路

    一个小的考试系统 android 思路 假如有 100 组,每组有4个单选钮,设置超时检测确认后去测结果估分视图去切换,如果还有,就再显示下一组 所有结束就给个总结显示 有超时结束过程加上 提示正确选 ...

  4. codeforces 1037E. Trips(倒叙)

    题目传送门: 解题思路: 正着搞好像有点恶心. 反着搞. 一边删一边搞,从崩坏的地方开始,入度--. 最后dfs崩坏,更新答案. 注意要把边删掉防止重复崩坏. 代码: #include<cstd ...

  5. 【Java学习】Font字体类的用法介绍

    一.Font类简介 Font类是用于设置图形用户界面上的字体样式的,包括字体类型(例如宋体.仿宋.Times New Roman等).字体风格(例如斜体字.加粗等).以及字号大小. 二.Font类的引 ...

  6. HttpClient的基本使用

    HttpClient的基本使用 前言 HttpClient是Apache提供的一个用于在Java中处理HTTP请求.响应操作的工具,由于JDK自带的API对HTTP协议的支持不是很友好,使用起来也不是 ...

  7. redhat6.5安装10201解决办法

    rpm --import /etc/pki/rpm-gpg/RPM*yum install -y  --skip-broken compat-libstdc++* elfutils-libelf* g ...

  8. vs2015 EF code first 问题待解决

    在vs 2013 上可以成功ef 生成代码.EF power Tools 安装在vs 2015 :一般不可安装, 把扩展名改成zip,解压缩. 打开extension.vsixmanifest文件 找 ...

  9. [Node.js] Node Util Promisify - How to Convert Callback Based APIs to Promise-based

    Since Node.js V8.0+, it introduces a 'util' libaray, which has a 'promisfy' function. It can conver ...

  10. 启动Tomcat,startup.bat一闪而过的解决办法

    1.打开命令行:win+R --> cmd2.将解压后的tomcat\bin\startup.bat文件拖到控制台窗口中,回车. 这样就可以看到错误信息的提示,根据提示修改即可.