郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^

我要捐赠: 点击捐赠

Cocos2d-X源代码下载:点我传送

游戏官方下载:http://dwz.cn/RwTjl

游戏视频预览:http://dwz.cn/RzHHd

游戏开发博客:http://dwz.cn/RzJzI

游戏源代码传送http://dwz.cn/Nret1

A.文件上传
思路:
发送文件数据给server
使用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 haomengzhu on 15/1/28.
6 // Copyright (c) 2015年 haomengzhu. 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 : 指定參数名(必须跟server端保持一致)
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
 
 

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

假设文章对您有所帮助,欢迎给作者捐赠。支持郝萌主。捐赠数额任意,重在心意^_^

我要捐赠: 点击捐赠

Cocos2d-X源代码下载:点我传送

游戏官方下载:http://dwz.cn/RwTjl

游戏视频预览:http://dwz.cn/RzHHd

游戏开发博客:http://dwz.cn/RzJzI

游戏源代码传送http://dwz.cn/Nret1

iOS多线程与网络开发之小文件上传的更多相关文章

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

    A.文件上传 思路: 发送文件数据给服务器 使用post请求 必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type 请求体:文件数据 文件上传的格 ...

  2. iOS开发之多文件上传

    // //  ViewController.m //  B03-多文件上传 // //  Created by 0426iOS on 15/7/1. //  Copyright (c) 2015年 0 ...

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

    对阿里云OSS上传小文件时的进度,想过两个方法:一是.通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭, ...

  4. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

  5. asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)

    上文件传很常见,现在就文件上传利用HTML的File控件(uploadify)的,这里为大家介绍一下(uploadify)的一些使用方法.在目前Web开发中用的比较多的,可能uploadify(参考h ...

  6. python运维开发(二十一)----文件上传和验证码+session

    内容目录: 文件上传 验证码+session 文件和图片的上传功能 HTML Form表单提交,实例展示 views 代码 HTML ajax提交 原生ajax提交,XMLHttpRequest方式上 ...

  7. iOS开发之AFNetworking实现数据传输和文件上传

    //传输数据 1 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.r ...

  8. Spring boot+Vue全栈开发---Spring Boot文件上传

    https://blog.csdn.net/Day_and_Night_2017/article/details/86980743 文件上传涉及到两个组件:CommonsMultipartResolv ...

  9. 分享一个FileUtil工具类,基本满足web开发中的文件上传,单个文件下载,多个文件下载的需求

    获取该FileUtil工具类具体演示,公众号内回复fileutil20200501即可. package com.example.demo.util; import javax.servlet.htt ...

随机推荐

  1. ionic2实战-使用Chart.js

    前言 Chart.js官网 Chart.js中文文档 安装Chart.js 执行cnpm install typings -g,全局安装Typings 执行typings search chart.j ...

  2. exit() 与 return() 的区别

    exit()与 return() 的区别为: 1. return返回函数值,是关键字:  exit 是一个函数. 2. return是语言级别的,它表示了调用堆栈的返回:而exit是系统调用级别的,它 ...

  3. linux文件属性详解及文件类型

    一  drwxr-xr-x的意思解释: ls -al 得到如下列表: drwxr-xr-x oracle dba May : oralog1 drwxr-x--- root root May : ro ...

  4. mac 常用操作

    1. 快速获取文件夹的位置: 打开文本 terminal 程序,将文件拖进去,路径会自己主动打印出来 2. 移动文件夹: 选中目标文件,然后使用 Command+C 复制,然后用 Command +O ...

  5. 背景.jpg

  6. C#中Hashtable的用法 转

    原文发布时间为:2009-04-14 -- 来源于本人的百度文章 [由搬家工具导入] 一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Coll ...

  7. configurationmanager.getsection usage example.

    1.app.config(note that attribute case sensitive!) <?xml version="1.0" encoding="ut ...

  8. poj 3693 Maximum repetition substring 重复次数最多的连续子串

    题目链接 题意 对于任意的字符串,定义它的 重复次数 为:它最多可被划分成的完全相同的子串个数.例如:ababab 的重复次数为3,ababa 的重复次数为1. 现给定一字符串,求它的一个子串,其重复 ...

  9. android基本控件学习-----ProgressBar

    ProgressBar(进度条)讲解 一.常用属性和基础使用实例 (1)常用属性: android:max:进度条的最大值 android:progress:进度条已完成进度值 android:pro ...

  10. Android开发基础(java)14

    Java语言与其他编程语言的最大不同之处在于:java有专门的异常处理机制,实现对各类异常情况进行有效控制. 一.基本概念:异常和错误的区别与联系: (1).定义形式不同:异常为exception:错 ...