您的位置:首页 > 移动开发 > IOS开发

iOS post异步请求图片上传的实现

2015-11-30 15:33 357 查看
1 网络请求中常用的有GET请求,POST请求,还有Head Put Delegate Options Trace Connect等

GET: 获取指定资源

POST:向指定资源提交数据进行处理请求,在RESTfull风格中用于新增资源

HEAD:获取指定资源头部信息

PUT:替换指定资源(不支持浏览器操作)

DELETE:删除指定资源

OPTIONS:允许客户端查看服务器的性能

TRACE:回复显示器收到的请求,主要用于测试或诊断

CONNECT:预留给能够将连接改为管道方式的代理服务器(HTTP代理使用)

2  上传图片在网页中最常用的就是POST请求,将图片编码到POST请求体中(body),通过请求数据一起发送到服务器上;

3 在iOS 开发中,图片上传的请求体比较难写 

--Boundary+72D4CD655314C423 
 // 分割符,以“--”开头,后面的字随便写,只要不写中文即可
Content-Disposition:
form-data; name="file"; filename="1.png"  // 这里注明服务器接收图片的参数及服务器上保存图片的文件名
Content-Type:image/png  //
图片类型为png
Content-Transfer-Encoding:
binary  // 编码方式
[align=left]  // 这里是空一行,必不可少!![/align]
... contents of
boris.png ...  // 图片数据部分
[align=left]--Boundary+72D4CD655314C423--  // 分隔符后面以"--"结尾,表明结束[/align]

如果有其他表单数据,如传用户ID等参数,也要写成以上格式:

[align=left]
[/align]

具体参数含义与图片一致,一般这段会在图片上面,因此没有结尾符,如果没有其他数据了,那要加上结尾符。

#import "SecondViewController.h"

@interface
SecondViewController ()

@property (nonatomic ,
strong)NSMutableData *myResponseData;

@property (nonatomic ,
copy)NSString *path;

@property (nonatomic ,
copy)NSString *token;

@end

@implementation SecondViewController

- (void)viewDidLoad {

    [super
viewDidLoad];

    

    NSString *urlStr =
@"http://upload.qiniu.com/";

    _path = [[NSBundle
mainBundle] pathForResource:@"1.png"
ofType:nil];

    _token =
@"oIERcq2no59Pv4LtQXZM99Oye33cewMOrt0JzbX7:X4PGVSLT3xS1UoOLC38E3MquLhM=:eyJzY29wZSI6ImFvbGlhbyIsImRlYWRsaW5lIjoxNDQ4ODcxNjkyfQ==";

    

    NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:[NSURL
URLWithString:urlStr] cachePolicy:0
timeoutInterval:5.0f];

    

//    //发送异步请求

//    //获取一个主队列

    [self
uploadWithRequest:request withPath:_path
withToken:_token];

    //直接利用sendAsynchronousRequest
达到异步请求的作用

//    NSOperationQueue *queue = [NSOperationQueue mainQueue];

//    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

//        

//        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

//        NSLog(@"%@",dic);

//    }];

    

}

- (void)uploadWithRequest:(NSMutableURLRequest *)request withPath:(NSString *)path withToken:(NSString *)token

{

    NSString *boundary = [NSString
stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()];

    NSMutableData *body = [NSMutableData data];

    

    //
表单数据

    NSMutableDictionary *param = [[NSMutableDictionary alloc] init];

    [param setValue:@"home" forKey:@"key"];

    [param setValue:token forKey:@"token"];

    [param
enumerateKeysAndObjectsUsingBlock:^(id key,
id obj,
BOOL *stop) {

        NSMutableString *fieldStr = [NSMutableString string];

        [fieldStr appendString:[NSString
stringWithFormat:@"--%@\r\n", boundary]];

        [fieldStr appendString:[NSString
stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key]];

        [fieldStr appendString:[NSString
stringWithFormat:@"%@", obj]];

        [body appendData:[fieldStr dataUsingEncoding:NSUTF8StringEncoding]];

        [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    }];

    

    

    ///
图片数据部分

    NSMutableString *topStr = [NSMutableString string];

//    NSString *path = [[NSBundle mainBundle] pathForResource:@"1.png" ofType:nil];

    NSData *data = [NSData dataWithContentsOfFile:path];

    

   

    [topStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];

    [topStr appendString:@"Content-Disposition: form-data; name=\"file\"; filename=\"1.png\"\r\n"];

    [topStr appendString:@"Content-Type:image/png\r\n"];

    [topStr appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];

    [body appendData:[topStr dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:data];

    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

  

    NSString *bottomStr = [NSString
stringWithFormat:@"--%@--", boundary];

    [body appendData:[bottomStr dataUsingEncoding:NSUTF8StringEncoding]];

    

    //
设置请求类型为post请求

    request.HTTPMethod = @"post";

    //
设置request的请求体

    request.HTTPBody = body;

   
// 设置头部数据,标明上传数据总大小,用于服务器接收校验

    [request setValue:[NSString stringWithFormat:@"%ld", body.length] forHTTPHeaderField:@"Content-Length"];

    //
设置头部数据,指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。

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

    

    _myResponseData = [[NSMutableData alloc] init];

    //利用delegate达到异步请求的作用

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    [connection start];

}

#pragma mark -- NSURLConnectionDelegate ---

//发出网络请求后,对方会有一个响应,告诉你,它已经收到网络请求了

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    [_myResponseData setLength:0];

    [UIApplication sharedApplication].networkActivityIndicatorVisible =
YES;

}

//网络请求结束后
调用的方法

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{

    [UIApplication
sharedApplication].networkActivityIndicatorVisible =
NO;

    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_myResponseData options:kNilOptions error:nil];

    NSLog(@"%@",dic);

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    [_myResponseData appendData:data];

}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

    NSLog(@"%@",error);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: