文档章节

ios实战-上传图片到服务器

余成海
 余成海
发布于 2015/04/22 13:37
字数 578
阅读 14053
收藏 9

当然如果你的项目大的话最好使用开源的网络库ASI或者AFNetWork,库里面都有现有的方法,

如果你觉得就是想自己写一个,看这里

- (NSMutableURLRequest *)PostImageRequest:(NSString *)URLString
                                  UIImage:(UIImage*)image
                               parameters:(NSDictionary *)parameters
                                  success:(void (^)(id))success
                                  failure:(void (^)(NSError *))failure
{
    _success = success;
    _failure = failure;
    //分界线的标识符
    NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
    //根据url初始化request
    _request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                       timeoutInterval:10];
    //分界线 --AaB03x
    NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
    //结束符 AaB03x--
    NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
    //得到图片的data
    NSData* data = UIImageJPEGRepresentation(image, 1);
    //http body的字符串
    NSMutableString *body=[[NSMutableString alloc]init];
    //参数的集合的所有key的集合
    NSArray *keys= [parameters allKeys];

    //遍历keys
    for(int i=0;i<[keys count];i++)
    {
        //得到当前key
        NSString *key=[keys objectAtIndex:i];
        //如果key不是pic,说明value是字符类型,比如name:Boris
        if(![key isEqualToString:@"pic"])
        {
            //添加分界线,换行
            [body appendFormat:@"%@\r\n",MPboundary];
            //添加字段名称,换2行
            [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
            //添加字段的值
            [body appendFormat:@"%@\r\n",[parameters objectForKey:key]];
        }
    }

    ////添加分界线,换行
    [body appendFormat:@"%@\r\n",MPboundary];
    //声明pic字段,文件名为boris.png
    [body appendFormat:@"Content-Disposition: form-data; name=\"ImageField\"; filename=\"x1234.png\"\r\n"];
    //声明上传文件的格式
    [body appendFormat:@"Content-Type: image/jpeg\r\n\r\n"];

    //声明结束符:--AaB03x--
    NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];
    //声明myRequestData,用来放入http body
    NSMutableData *myRequestData=[NSMutableData data];
    //将body字符串转化为UTF8格式的二进制
    [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
    //将image的data加入
    [myRequestData appendData:data];
    //加入结束符--AaB03x--
    [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];

    //设置HTTPHeader中Content-Type的值
    NSString *content=[[NSString alloc] initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
    //设置HTTPHeader
    [_request setValue:content forHTTPHeaderField:@"Content-Type"];
    //设置Content-Length
    [_request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];
    //设置http body
    [_request setHTTPBody:myRequestData];
    //http method
    [_request setHTTPMethod:@"POST"];
    
    return _request;
}
- (void)start
{
    if (_request) {
        _urlConnection = [[NSURLConnection alloc]initWithRequest:_request delegate:self];
    }
    _request = nil;
}

- (void)syncStart
{
    if (_request) {
        NSError *error;
        NSData *returnData = [NSURLConnection sendSynchronousRequest:_request returningResponse:nil error:&error];
        if (!error) {
            NSString *receiveStr = [[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding];
            _success(receiveStr);
        } else {
            _failure(error);
        }
    }
    _request = nil;
}
#pragma mark ---- NSURLConnectionDataDelegate -----
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
    //NSLog(@"%@",[res allHeaderFields]);
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_responseData appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *receiveStr = [[NSString alloc]initWithData:_responseData encoding:NSUTF8StringEncoding];
    _success(receiveStr);
}

#pragma mark ---- NSURLConnectionDelegate -----
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    _failure(error);
}

使用方法:

[httpManager PostImageRequest:UploadImageUrl
                          UIImage:image
                       parameters:params
                          success:^(id msg) {
                              debugLog(@"upload image success:%@", msg);
                              success(msg);
                         
                          } failure:^(NSError *error) {
                              failure(error);
                          }];
    
    [httpManager start];

NSURLConnection的使用方法就不细说了,查看查询文档或者到网上找

© 著作权归作者所有

余成海
粉丝 62
博文 57
码字总数 29577
作品 0
杭州
iOS工程师
私信 提问
ReactNative IOS模块

[背景] 目前已经开发好相同功能的android版本,本人不会ios开发,无从下手 [需求] 1、语音录制模块 功能需求:语音(开始、停止、试听)、压缩后上传到指定服务器 接收标准: a、IOS端原生模...

孟凯
2016/05/22
14
0
十八般武艺!移动应用开发者必备的18款利器

“工欲善其事,必先利其器”。身为一名移动应用的开发者,光有技术是不够的,必备的应用可以为您的开发工作如虎添翼。随着Android与iOS系统的不断更新换代,相关的的应用也层出不穷,本文推荐...

looen
2011/11/25
2.3K
3
PHP POST接收处理 IOS上传NSData图片数据,上传图片到服务器

【IOS 接收PHP 图片】 1,PHP将图片的URL直接返回给IOS端即可,IOS获取到URL处理,下载缓存就可以在APP端使用了。 【IOS上传图片PHP接收】 1、IOS上传图片可能有很多方法,今天作者我用了这种...

RablePHP
2014/11/28
8.6K
3
resin在哪里设置post长度

今天做与ios对接上传图片,ios那边把图片转为base64传过来,我这边接收后转换后显示错误,调试发现,接收只接收了一小半数据,在网上查了半天,说web容器那边可能有限制post数据的地方,有没有...

ForTheFree
2014/06/03
1K
2
ios向服务器上传照片失败的问题,求指点

android和ios客户端调用同一个服务器(java)接口上传照片,android成功,ios失败,原因在于android 上传时服务器端Servlet的this.getRequest获得的request对象是multiPartRequestWrapper,i...

wjdroid
2017/11/30
300
2

没有更多内容

加载失败,请刷新页面

加载更多

Guava 3: 集合Collections

正文 一、引子 Guava 对JDK集合的拓展,是最成熟且最受欢迎的部分。本文属于Guava的核心,需要仔细看。 二、Guava 集合 2.1 Immutable Collections不可变集合 1.作用 用不变的集合进行防御性...

孟飞阳
11分钟前
2
0
源码分析 RocketMQ DLedger 多副本存储实现

RocketMQ DLedger 的存储实现思路与 RocketMQ 的存储实现思路相似,本文就不再从源码角度详细剖析其实现,只是点出其实现关键点。我们不妨简单回顾一下 CommitLog 文件、ConsumeQueue 文件设...

中间件兴趣圈
16分钟前
2
0
vue入门--简单路由配置

本文转载于:专业的前端网站➜vue入门--简单路由配置   在初始化vue init webpack <工程名>时,有一步是询问是否安装vue-router,选择yes,如果没有安装的话,后面需要自己安装。然后在目录...

前端老手
46分钟前
5
0
怎么给视频配音

很多刚开始尝试视频制作的小伙伴,帮助到怎么给制作完成的视频配音,其实给视频配音的方法非常简单,在手机上可以进行制作,下面一起来看看给视频配音的方法吧! 具体步骤如下: 1、首先在手...

白米稀饭2019
56分钟前
4
0
windows批处理bat脚本编写

什么是bat脚本 .bat结尾的文件其实就是windows上的批处理脚本,Windows中的bat文件相当于 Linux中shell编程的.sh脚本,批量执行DOS命令。 其最简单的例子,是逐行书写在命令行中会用到的各种...

孙幼凌
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部