高效文件上传实现技巧:原始方法与AFNetworking对比分析

更新:11-01 名人轶事 我要投稿 纠错 投诉

大家好,今天小编来为大家解答以下的问题,关于高效文件上传实现技巧:原始方法与AFNetworking对比分析,这个很多人还不知道,现在让我们一起来看看吧!

NSURL *url=[NSURL URLWithString:@"上传到服务器的文件的Url"];

NSMutableURLRequest *请求=[NSMutableURLRequest requestWithURL:url];

request.HTTPMethod=@"POST";

2.设置请求头(告诉服务器这是一个文件上传请求)

非文件参数(普通用户名、账号、密码等参数)

--此文件上传的标识字符串rn

Content-Disposition: 表单数据; name="参数名称"rn

rn

参数值

rn

文件参数(上传文件的二进制数据,如果上传多个文件,多次使用此格式)

--此文件上传的标识字符串rn

Content-Disposition: 表单数据; name="参数名称"; filename="文件名"rn

Content-Type: 文件的MIME 类型rn

rn

文件数据

rn

添加结束标签,格式必须遵循

--此文件上传的标识字符串--rn

示例程序:

#define XMGBoundary @"520it"

#define XMGEncode(string) [字符串dataUsingEncoding:NSUTF8StringEncoding]

#define XMGNewLine [@"rn" dataUsingEncoding:NSUTF8StringEncoding]

#import "ViewController.h"

@interfaceViewController()

@结尾

@实现ViewController

- (void)viewDidLoad {

[超级viewDidLoad];

//创建请求

NSURL *url=[NSURL URLWithString:@"http://120.25.226.186:32812/上传"];

NSMutableURLRequest *请求=[NSMutableURLRequest requestWithURL:url];

request.HTTPMethod=@"POST";

//设置请求头(告诉服务器这是一个文件上传请求)

[请求setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", XMGBoundary] forHTTPHeaderField:@"Content-Type"];

//设置请求体

NSMutableData *body=[NSMutableData 数据];

//文件参数

/*

--分隔线rn

Content-Disposition: 表单数据; name="参数名称"; filename="文件名"rn

Content-Type: 文件的MIME 类型rn

rn

文件数据

rn

*/

//分向線

[主体appendData:XMGEncode(@"--")];

[主体appendData:XMGEncode(XMGBoundary)];

[正文附加数据:XMGNewLine];

//文件参数名称

[body appendData:XMGEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name="file"; filename="test.png""])];

[正文附加数据:XMGNewLine];

//文件类型

[body appendData:XMGEncode([NSString stringWithFormat:@"Content-Type: image/png"])];

[正文appendData:XMGNewLine];

//文件数据

[正文附加数据:XMGNewLine];

//UIImageJPEGRepresentation(#UIImage *image#,#CGFloat compressionQuality#)

UIImage *image=[UIImage imageNamed:@"占位符"];

[主体appendData:UIImagePNGRepresentation(图像)];

//[bodyappendData:[NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/test.png"]];

[正文附加数据:XMGNewLine];

//非文件参数

/*

--分隔线rn

Content-Disposition: 表单数据; name="参数名称"rn

rn

参数值

rn

*/

//分向線

[主体appendData:XMGEncode(@"--")];

[主体appendData:XMGEncode(XMGBoundary)];

[正文附加数据:XMGNewLine];

//参数名称

[body appendData:XMGEncode([NSString stringWithFormat:@"Content-Disposition: 表单数据; name="用户名""])];

[正文附加数据:XMGNewLine];

//参数值

[正文附加数据:XMGNewLine];

[正文appendData:XMGEncode(@"jack")];

[正文附加数据:XMGNewLine];

//结束标记

/*

--分隔线--rn

*/

[主体appendData:XMGEncode(@"--")];

[主体appendData:XMGEncode(XMGBoundary)];

[主体appendData:XMGEncode(@"--")];

[正文附加数据:XMGNewLine];

请求.HTTPBody=正文;

[NSURLConnection sendAsynchronousRequest:请求队列:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse *响应,NSData *数据,NSError *connectionError) {

NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);

}];

}

@结束2。使用AFN提供的POST方法最为方便

上传单个文件

AFHTTPSessionManager *mgr=[AFHTTPSessionManager 管理器];

[mgr POST:@"http://120.25.226.186:32812/上传"参数:@{@"用户名":@"123"}

ConstructionBodyWithBlock:^(idformData) {

//设置该块要上传的文件

//NSData *data=[NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/placeholder.png"];

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

//[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/placeholder.png"] name:@"file" fileName:@"xxx.png" mimeType:@"image/png" error:nil];

[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/placeholder.png"] name:@"file" error:nil];

} success:^(NSURLSessionDataTask *任务,id responseObject) {

NSLog(@"--------%@",responseObject);

} failure:^(NSURLSessionDataTask *任务,NSError *错误) {

}];

上传多个文件

AFHTTPSessionManager *sharedManager1=[[AFHTTPSessionManager alloc]init];

SharedManager1.requestSerializer=[AFHTTPRequestSerializer 序列化器];

sharedManager1.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain",nil];

SharedManager1.requestSerializer.timeoutInterval=20;

[sharedManager1.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

[sharedManager1.requestSerializer setValue:@"text/html; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

NSDictionary *dic=@{@"param.token":_token};

[sharedManager1 POST:kUploadFile 参数:dic ConstructionBodyWithBlock:^(id_Nonnull formData) {

for (int i=0; i fileUpload.count; i ++) {

NSData *data=UIImageJPEGRepresentation(fileUpload[i], 0.3);

NSDateFormatter *formatter=[[NSDateFormatter alloc] init];

//设置时间格式

formatter.dateFormat=@"yyyyMMddHHmmss";

NSString *str=[格式化程序stringFromDate:[NSDate 日期]];

NSString *fileName=[NSString stringWithFormat:@"%@-%@.jpeg", str,[NSString stringWithFormat:@"%d",i]];

[formDataappendPartWithFileData:数据名称:@"文件上传"文件名:文件名mimeType:@"图像/jpeg"];

}

} success:^(NSURLSessionDataTask * _Nonnull 任务, id _Nonnull responseObject) {

成功(任务,响应对象);

} failure:^(NSURLSessionDataTask * _Nonnull 任务, NSError * _Nonnull 错误) {

失败(任务,错误);

}];3。 NSURLSessionConfiguration实现文件上传

NSMutableURLRequest *请求=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/upload"]];

request.HTTPMethod=@"POST";

//设置请求头(告诉服务器这是一个文件上传请求)

[请求setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", XMGBoundary] forHTTPHeaderField:@"Content-Type"];

//设置请求体

NSMutableData *body=[NSMutableData 数据];

//文件参数

//分向線

[主体appendData:XMGEncode(@"--")];

[主体appendData:XMGEncode(XMGBoundary)];

[正文附加数据:XMGNewLine];

//文件参数名称

[body appendData:XMGEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name="file"; filename="test.png""])];

[正文附加数据:XMGNewLine];

//文件类型

[body appendData:XMGEncode([NSString stringWithFormat:@"Content-Type: image/png"])];

[正文附加数据:XMGNewLine];

//文件数据

[正文附加数据:XMGNewLine];

[bodyappendData:[NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/test.png"]];

[正文附加数据:XMGNewLine];

//结束标记

/*

--分隔线--rn

*/

[主体appendData:XMGEncode(@"--")];

[主体appendData:XMGEncode(XMGBoundary)];

[主体appendData:XMGEncode(@"--")];

[正文附加数据:XMGNewLine];

[[self.session uploadTaskWithRequest:request fromData:body finishHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

NSLog(@"--------%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);

}]简历];4。使用AFN的uploadTaskWithRequest方法需要类似的NSURLSessionConfiguration和原始上传数据。拼接请求体比较麻烦。

AFHTTPSessionManager *mgr=[AFHTTPSessionManager 管理器];

NSURLRequest *请求=[NSURLRequest requestWithURL:@""];

NSMutableData *body=[NSMutableData 数据];

[mgr uploadTaskWithRequest:request fromData:bodyprogress:#(NSProgress *__autoreleasing *)#completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {

用户评论

青袂婉约

我想学怎么自己手动把文件传到服务器啊,这个帖子太棒了!

    有5位网友表示赞同!

微信名字

看标题感觉可以学习两套方法上传文件,效率肯定不一样吧?

    有7位网友表示赞同!

走过海棠暮

我之前用原生方式做过,不过遇到一些问题,不知道AFNetworking能不能解决

    有5位网友表示赞同!

花开丶若相惜

这两个方法都可以用吗?有没有实际应用场景的区别?

    有5位网友表示赞同!

一样剩余

希望帖子能详细比较两者的优缺点,方便我们选择合适的方式

    有10位网友表示赞同!

优雅的叶子

AFNetworking我听说过,就是个常用的框架吧?

    有20位网友表示赞同!

沐晴つ

原始的方式太麻烦了,肯定想要使用高效率的工具

    有6位网友表示赞同!

陌離

上传大文件是不是用 AFNetworking 会更快?

    有13位网友表示赞同!

尘埃落定

我想了解一下文件上传过程中有哪些细节需要注意?

    有11位网友表示赞同!

陌颜幽梦

这个帖子对开发手机应用的朋友很有帮助吧!

    有19位网友表示赞同!

烟雨萌萌

学习了这么基础的知识点,可以快速上手开发

    有15位网友表示赞同!

瑾澜

希望能看到代码示例,方便我更好地理解这些方法

    有19位网友表示赞同!

何必锁我心

AFNetworking 的使用文档看上有点难懂,希望帖子能简化说明

    有9位网友表示赞同!

掉眼泪

我更倾向于使用简便快捷的框架,这样更容易开发

    有18位网友表示赞同!

病房

这个学习目标很有针对性,正好可以提升我自己的技能!

    有11位网友表示赞同!

青衫故人

文件的安全性在上传过程中也是很重要的因素吧?

    有13位网友表示赞同!

温柔腔

不知道两个方法上传文件时的数据大小限制有什么区别?

    有10位网友表示赞同!

执笔画眉

帖子可以分享一些实际案例吗?

    有6位网友表示赞同!

枫无痕

希望以后能学习到更高级的网络编程知识

    有7位网友表示赞同!

颜洛殇

文件上传的过程看似简单,但是细节很多啊!

    有8位网友表示赞同!

【高效文件上传实现技巧:原始方法与AFNetworking对比分析】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:《经典歌曲集锦:探索Try的动人旋律》 下一篇:凌晨五点的城市高架桥全景