【移动应用开发技术】怎么在iOS中实现文件上传功能_第1页
【移动应用开发技术】怎么在iOS中实现文件上传功能_第2页
【移动应用开发技术】怎么在iOS中实现文件上传功能_第3页
【移动应用开发技术】怎么在iOS中实现文件上传功能_第4页
【移动应用开发技术】怎么在iOS中实现文件上传功能_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在iOS中实现文件上传功能

怎么在iOS中实现文件上传功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面在下将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、POST方式上传POST方式提交信息默认使用的是:*Content-Type:

application/x-www-form-urlencoded.*输入中文时,post方式自动进行转义(苹果中自动).国内的绝大多数网站都采用这种方式上传文件(支持二进制文件)*Content-Type:multipart/form-data(上传文件)*都会限制上传文件的大小一般是2M或者更小。在苹果中进行上传操作十分麻烦。需要拼接好上传所需要的字符串格式,然后才能实现上传。(还要加上头部)其他平台做的好一点的可能封装好了,不需要自己拼接字符串格式。因此iOS中很少用这种方式上传。示例代码:#import

"XNUploadFile.h"

#define

kTimeOut

5.0f

@implementation

XNUploadFile

/**

分隔字符串

*/

static

NSString

*boundaryStr

=

@"--";

/**

本次上传标示字符串

*/

static

NSString

*randomIDStr;

/**

上传(php)脚本中,接收文件字段

*/

static

NSString

*uploadID;

-

(instancetype)init

{

self

=

[super

init];

if

(self)

{

/**

本次上传标示字符串

*/

randomIDStr

=

@"itcastupload";

/**

上传(php)脚本中,接收文件字段

*/

//

可以咨询公司的网站开发程序员

//

或者用FireBug自己跟踪调试

uploadID

=

@"uploadFile";

}

return

self;

}

#pragma

mark

-

成员方法.

用NSURLSession来完成上传

-

(void)uploadFile:(NSString

*)path

fileName:(NSString

*)fileName

completion:(void

(^)(NSString

*string))completion

{

//

1.

url

提示:真正负责文件上传的是php文件,而不是html文件

NSURL

*url

=

[NSURL

URLWithString:@"http://localhost/new/post/upload.php"];

//

2.

request

NSURLRequest

*request

=

[self

requestForUploadURL:url

uploadFileName:fileName

localFilePath:path];

//

3.

session(回话)

//

全局网络回话,为了方便程序员使用网络服务

NSURLSession

*session

=

[NSURLSession

sharedSession];

//

4.

数据任务->

任务都是由回话发起的

/**

URLSession的任务,默认都是在其他线程工作的,默认都是异步的

*/

[[session

dataTaskWithRequest:request

completionHandler:^(NSData

*data,

NSURLResponse

*response,

NSError

*error)

{

id

result

=

[NSJSONSerialization

JSONObjectWithData:data

options:0

error:NULL];

NSLog(@"%@

%@",

result,

[NSThread

currentThread]);

dispatch_async(dispatch_get_main_queue(),

^{

if

(completion)

{

completion(@"下载完成");

}

});

}]

resume];

//

NSURLSessionDataTask

*task

=

[session

dataTaskWithRequest:request

completionHandler:^(NSData

*data,

NSURLResponse

*response,

NSError

*error)

{

//

//

id

result

=

[NSJSONSerialization

JSONObjectWithData:data

options:0

error:NULL];

//

//

NSLog(@"%@

%@",

result,

[NSThread

currentThread]);

//

//

dispatch_async(dispatch_get_main_queue(),

^{

//

if

(completion)

{

//

completion(@"下载完成");

//

}

//

});

//

}];

//

//

//

5.

启动任务

//

[task

resume];

}

#pragma

mark

-

私有方法

拼字符串

/**

拼接顶部字符串

*/

-

(NSString

*)topStringWithMimeType:(NSString

*)mimeType

uploadFile:(NSString

*)uploadFile

{

NSMutableString

*strM

=

[NSMutableString

string];

[strM

appendFormat:@"%@%@\n",

boundaryStr,

randomIDStr];

[strM

appendFormat:@"Content-Disposition:

form-data;

name=\"%@\";

filename=\"%@\"\n",

uploadID,

uploadFile];

[strM

appendFormat:@"Content-Type:

%@\n\n",

mimeType];

NSLog(@"顶部字符串:%@",

strM);

return

[strM

copy];

}

/**

拼接底部字符串

*/

-

(NSString

*)bottomString

{

NSMutableString

*strM

=

[NSMutableString

string];

[strM

appendFormat:@"%@%@\n",

boundaryStr,

randomIDStr];

[strM

appendString:@"Content-Disposition:

form-data;

name=\"submit\"\n\n"];

[strM

appendString:@"Submit\n"];

[strM

appendFormat:@"%@%@--\n",

boundaryStr,

randomIDStr];

NSLog(@"底部字符串:%@",

strM);

return

[strM

copy];

}

/**

指定全路径文件的mimeType

*/

-

(NSString

*)mimeTypeWithFilePath:(NSString

*)filePath

{

//

1.

判断文件是否存在

if

(![[NSFileManager

defaultManager]

fileExistsAtPath:filePath])

{

return

nil;

}

//

2.

使用HTTP

HEAD方法获取上传文件信息

NSURL

*url

=

[NSURL

fileURLWithPath:filePath];

NSMutableURLRequest

*request

=

[NSMutableURLRequest

requestWithURL:url];

//

3.

调用同步方法获取文件的MimeType

NSURLResponse

*response

=

nil;

[NSURLConnection

sendSynchronousRequest:request

returningResponse:&response

error:NULL];

return

response.MIMEType;

}

/**

上传文件网络请求

*/

-

(NSURLRequest

*)requestForUploadURL:(NSURL

*)url

uploadFileName:(NSString

*)fileName

localFilePath:(NSString

*)filePath

{

//

0.

获取上传文件的mimeType

NSString

*mimeType

=

[self

mimeTypeWithFilePath:filePath];

if

(!mimeType)

return

nil;

//

1.

拼接要上传的数据体

NSMutableData

*dataM

=

[NSMutableData

data];

[dataM

appendData:[[self

topStringWithMimeType:mimeType

uploadFile:fileName]

dataUsingEncoding:NSUTF8StringEncoding]];

//

拼接上传文件本身的二进制数据

[dataM

appendData:[NSData

dataWithContentsOfFile:filePath]];

[dataM

appendData:[[self

bottomString]

dataUsingEncoding:NSUTF8StringEncoding]];

//

2.

设置请求

NSMutableURLRequest

*requestM

=

[NSMutableURLRequest

requestWithURL:url

cachePolicy:0

timeoutInterval:kTimeOut];

//

1>

设定HTTP请求方式

requestM.HTTPMethod

=

@"POST";

//

2>

设置数据体

requestM.HTTPBody

=

dataM;

//

3>

指定Content-Type

NSString

*typeStr

=

[NSString

stringWithFormat:@"multipart/form-data;

boundary=%@",

randomIDStr];

[requestM

setValue:typeStr

forHTTPHeaderField:@"Content-Type"];

//

4>

指定数据长度

NSString

*lengthStr

=

[NSString

stringWithFormat:@"%@",

@([dataM

length])];

[requestM

setValue:lengthStr

forHTTPHeaderField:@"Content-Length"];

return

[requestM

copy];

}注意:POST上传时,是不允许重名的.(否则出错)二、PUT方式上传session中的upload方法只能用于PUT上传,不能用于POST上传.用PUT方式上传的好处:(需要身份验证)*不用像POST一样,拼一堆字符串.*直接base64编码一下身份验证,session的upload一调用就行了.*没有文件大小限制.*即时通讯里面用的多.(发图片/发语音)-

(void)putFile

{

//

1.

url

最后一个是要上传的文件名

NSURL

*url

=

[NSURL

URLWithString:@"http://localhost/uploads/abcd"];

//abcd为文件名

//

2.

request

NSMutableURLRequest

*request

=

[NSMutableURLRequest

requestWithURL:url];

request.HTTPMethod

=

@"PUT";

//

request.HTTPMethod

=

@"DELETE";

//

设置用户授权

//

BASE64编码:一种对字符串和二进制数据进行编码的一种“最常用的网络编码方式”,此编码可以将二进制数据转换成字符串!

//

是很多加密算法的底层算法

//

BASE64支持反编码,是一种双向的编码方案

NSString

*authStr

=

@"admin:123";

NSString

*authBase64

=

[NSString

stringWithFormat:@"Basic

%@",

[self

base64Encode:authStr]];

[request

setValue:authBase64

forHTTPHeaderField:@"Authorization"];

//

3.

URLSession

NSURLSession

*session

=

[NSURLSession

sharedSession];

//

4.

由session发起任务

NSURL

*localURL

=

[[NSBundle

mainBundle]

URLForResource:@"001.png"

withExtension:nil];

[[session

uploadTaskWithRequest:request

fromFile:localURL

completionHandler:^(NSData

*data,

NSURLRespons

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论