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

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  // 编码方式
  // 这里是空一行,必不可少!!
... contents of boris.png ...  // 图片数据部分
--Boundary+72D4CD655314C423--  // 分隔符后面以"--"结尾,表明结束

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

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




#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);

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值