[iOS 多线程 & 网络 - 2.5] - 小文件上传

A.文件上传

思路:

发送文件数据给服务器

使用post请求

必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type

请求体:文件数据

文件上传的格式要求十分严格,必须严格遵守

由于是一次性加载文件到内存上传,所以只能用于小文件上传

B.实现

1.设置POST请求

(1)使用POST请求方法

(2)设置请求头

设置内容长度、内容类型、分割线

(3)设置请求体

NSMutableData *body = [NSMutableData data];

分割线 + 换行

内容描述 + 换行

内容类型 + 换行

换行

文件二进制数据 + 换行

分割线--

multipart/form-data 中的内容

例如使用chrome上传一张图片:

 

(4)使用本地请求获取某种文件类型的MIMEType

 1 /** 取得本地文件的MIMEType */
 2 - (void) getMIMEType {
 3     // Socket 实现断点上传
 4
 5     //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
 6     //    UIImage *image = [UIImage imageNamed:@"test"];
 7     //    NSData *filedata = UIImagePNGRepresentation(image);
 8     //    [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}];
 9
10     // 给本地文件发送一个请求
11     NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil];
12     NSURLRequest *request = [NSURLRequest requestWithURL:fileurl];
13     NSURLResponse *repsonse = nil;
14     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];
15
16     // 得到mimeType
17     NSLog(@"%@", repsonse.MIMEType);
18     [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom", @"type":@"xml"}];
19 }

附:常见文件类型的MIMEType

  1 //
  2 //  ViewController.m
  3 //  UploadFileDemo
  4 //
  5 //  Created by hellovoidworld on 15/1/28.
  6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
  7 //
  8
  9 #import "ViewController.h"
 10
 11 #define UTF8Encode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
 12
 13 @interface ViewController ()
 14
 15 - (IBAction)upload;
 16
 17 @end
 18
 19 @implementation ViewController
 20
 21 - (void)viewDidLoad {
 22     [super viewDidLoad];
 23     // Do any additional setup after loading the view, typically from a nib.
 24 }
 25
 26 - (void)didReceiveMemoryWarning {
 27     [super didReceiveMemoryWarning];
 28     // Dispose of any resources that can be recreated.
 29 }
 30
 31 - (IBAction)upload {
 32     UIImage *image = [UIImage imageNamed:@"IMG_0413"];
 33     NSData *imageData = UIImagePNGRepresentation(image);
 34     [self upload:@"uploadedFile" filename:@"IMG_0413.PNG" mimeType:@"image/png" data:imageData parmas:nil];
 35 }
 36
 37 - (void)upload:(NSString *)name filename:(NSString *)filename mimeType:(NSString *)mimeType data:(NSData *)data parmas:(NSDictionary *)params
 38 {
 39     // 文件上传
 40     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/upload"];
 41     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 42     request.HTTPMethod = @"POST";
 43
 44     // 设置请求体
 45     NSMutableData *body = [NSMutableData data];
 46
 47     /***************文件参数***************/
 48     // 参数开始的标志
 49     [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary\r\n")];
 50     // name : 指定参数名(必须跟服务器端保持一致)
 51     // filename : 文件名
 52     NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, filename];
 53     [body appendData:UTF8Encode(disposition)];
 54     NSString *type = [NSString stringWithFormat:@"Content-Type: %@\r\n", mimeType];
 55     [body appendData:UTF8Encode(type)];
 56
 57     [body appendData:UTF8Encode(@"\r\n")];
 58     [body appendData:data];
 59     [body appendData:UTF8Encode(@"\r\n")];
 60
 61     /***************普通参数***************/
 62     [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
 63         // 参数开始的标志
 64         [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary\r\n")];
 65         NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", key];
 66         [body appendData:UTF8Encode(disposition)];
 67
 68         [body appendData:UTF8Encode(@"\r\n")];
 69         [body appendData:UTF8Encode(obj)];
 70         [body appendData:UTF8Encode(@"\r\n")];
 71     }];
 72
 73     /***************参数结束***************/
 74     // HelloVoidWorldBoundary--\r\n
 75     [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary--\r\n")];
 76     request.HTTPBody = body;
 77
 78     // 设置请求头
 79     // 请求体的长度
 80     [request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"];
 81     // 声明这个POST请求是个文件上传
 82     [request setValue:@"multipart/form-data; boundary=HelloVoidWorldBoundary" forHTTPHeaderField:@"Content-Type"];
 83
 84     // 发送请求
 85     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
 86         NSLog(@"开始上传~~~");
 87         if (data) {
 88             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
 89             NSLog(@"%@", dict);
 90         } else {
 91             NSLog(@"上传失败");
 92         }
 93     }];
 94 }
 95
 96 /** 取得本地文件的MIMEType */
 97 - (void) getMIMEType {
 98     // Socket 实现断点上传
 99
100     //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
101     //    UIImage *image = [UIImage imageNamed:@"test"];
102     //    NSData *filedata = UIImagePNGRepresentation(image);
103     //    [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}];
104
105     // 给本地文件发送一个请求
106     NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil];
107     NSURLRequest *request = [NSURLRequest requestWithURL:fileurl];
108     NSURLResponse *repsonse = nil;
109     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];
110
111     // 得到mimeType
112     NSLog(@"%@", repsonse.MIMEType);
113     [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom", @"type":@"xml"}];
114 }
115
116
117 @end
时间: 2024-11-08 22:18:39

[iOS 多线程 & 网络 - 2.5] - 小文件上传的相关文章

iOS多线程与网络开发之小文件上传

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源代码传送:http://dwz.cn/Nret1 A.文件上传 思路: 发送文件数据给server 使用post请求 必须手动设置请求头: 内

[iOS 多线程 & 网络 - 2.11] - ASI框架上传文件

A.ASI的上传功能基本使用 1.实现步骤 (1)创建请求 使用ASIFormDataRequest (2)设置上传文件路径 (3)发送请求 2.上传相册相片 UIImagePickerController用来选择图片 设置图片来源,可以选择相册 使用代理 UIImagePickerControllerDelegate方法,选择完成之后取得相片 1 // 2 // ViewController.m 3 // ASIUploadDemo 4 // 5 // Created by hellovoid

[iOS 多线程 & 网络 - 2.6] - 使用POST上传JSON数据 & 多值参数

A.上传JSON 1.思路: 必须使用POST方法才能上传大量JSON数据 设置请求头:设置Content-Type 设置请求体,JSON实际相当于字典,可以用NSDictionary NSJSONSerialization把字典数据转换成JSON二进制 2.实现 1 // 2 // ViewController.m 3 // PostJsonDemo 4 // 5 // Created by hellovoidworld on 15/1/28. 6 // Copyright (c) 2015年

关于Java网络爬虫---模拟txt文件上传操作。

业务需求是这样的,公司400业务中客户使用的,400电话号码,可以添加多个目的码你可以理解为转接号码: 这些配置的目的码我们会在网关服务器上配置成白名单,既拥有某些权限.先提出的要求是先添加或者变动目的码要及时同步到网关. 场景: 1.我们的网关服务器接受的白名单(目的码)是已txt文件上传的,数据按照制定的格式保存在txt里面. 2.利用Java网络爬虫模拟txt文件上传.------2018-4-7现在不写了,代码在公司电脑上明天总结一下在写. 原文地址:https://www.cnblog

阿里云 oss 小文件上传进度显示

对阿里云OSS上传小文件时的进度,想过两个方法:一是.通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭,在监測线程就会报"句柄无效"的错误,甚至会导致上传失败:第二个方法是通过线程不断监測OSS上已经上传文件的大小,可是在文件全然上传前是不能获得文件大小的. 最后突然灵感来了,把两个方法同一时候使用就行监測文件上传的进度. 看代码: // 上传小文件 private static void

ASP.NET访问网络映射盘&实现文件上传读取功能

最近在改Web的时候,遇到一个问题,要跨机器访问共享文件夹,以实现文件正常上传下载功能. 要实现该功能,可以采用HTTP的方式,也可以使用网络映射磁盘的方式,今天主要给大家分享一下使用网络映射磁盘的方式,来跨机器访问共享文件夹. 解决方案:   本以为只要在Web服务器做一下磁盘映射,然后把该映射盘符当做本地磁盘来使用就可以了,但是却一直有问题,查找了一下资料,是因为IIS默认账户为NETWORK_SERVICE,该账户是没权限访问共享目录的,所以当我们把站点部署到IIS上的时候,再访问映射磁盘

JavaScript实现拖拽预览,AJAX小文件上传

本地上传,提前预览(图片.视频) 1.html中div标签预览显示.button标签触发上传事件. <div id="drop_area" style="border:3px dashed silver;width:200px; height:200px">将图片拖拽到此</div> <button onclick="xhr2()">ajax上传</button> 2.禁止浏览器打开文件行为 doc

开源项目OkHttpPlus——支持GET、POST、UI线程回调、JSON格式解析、链式调用、文件上传下载

OkHttpPlus介绍 项目地址:https://github.com/ZhaoKaiQiang/OkHttpPlus 主要功能:OkHttp封装,支持GET.POST.UI线程回调.JSON格式解析.链式调用.小文件上传下载及进度监听等功能 为什么要写这么一个库呢? 首先,是因为OkHttp在4.4之后已经作为底层的Http实现了,所以OkHttp这个库很强大,值得我们学习. 其次,在我看来,OkHttp使用起来不如Volley方便,OkHttp的回调都是在工作线程,所以如果在回调里面操作V

atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传,避免一次使用内存使用过大的 2 2. Uuid还是原来文件名称:: 2 3. 监听器频繁地被调用 2 4. 结合wz easyui 2 4. 选型 2 5. Uploadify::yash js+flash 3 6. commons-fileupload:: 3 7. COS这个工具O'Reilly公司 3 8. 大的文件上传组件总结 3 5. 林吧实现ui Ajax+jq