通过iOS原生代码上传多个参数和一张图片(swift)

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

在iOS开发中,图片上传的请求体非常难写,格式要求非常严格,出一点错误都会造成上传失败,或请求数据失败,先看格式:

--Boundary+72D4CD655314C423

Content-Disposition: form-data;

name="uploadFile"; filename="001.png"

Content-Type:image/png

Content-Transfer-Encoding: binary

... contents of boris.png ...

--Boundary+72D4CD655314C423--

这是一个不带其他任务参数,body中只有一张图就要写成这样

分别说明一下:

--Boundary+72D4CD655314C423   //分割符,以“--”开头,后面的字随便写,只要不写中文即可

Content-Disposition: form-data;

name="uploadFile"; filename="001.png"  //这里注明服务器接收图片的参数(类似于接收用户名的userName)及服务器上保存图片的文件名

Content-Type:image/png  //图片类型为png

Content-Transfer-Encoding: binary  //编码方式

//这里是空一行,必不可少!!

... contents of boris.png ...  //图片数据部分

--Boundary+72D4CD655314C423--  //分隔符后面以"--"结尾,表明结束

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

--Boundary+72D4CD655314C423

Content-Disposition: form-data; name="userId"

254

--Boundary+72D4CD655314C423

Content-Disposition: form-data; name="shopId"

18718

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

下面是具体的代码:

let request=NSMutableURLRequest(URL:NSURL(string:url)!)

request.HTTPMethod="POST"//设置请求方式

//分割标识

let boundary:String="BOUNDARY"

//上传文件必须设置

let contentType:String="multipart/form-data;boundary="+boundary

request.addValue(contentType, forHTTPHeaderField:"Content-Type")


let body=NSMutableData()

//parameter是一个带有key, value的字典,这是所带的参数

for(key, value) in parameter {

print("zheli ",key,value)

letvalueStr = valueas!String

body.appendData(NSString(format:"--"+boundary+"\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

body.appendData(NSString(format:"Content-Disposition:form-data;name=\"\(key)\"\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

body.appendData(NSString(format:valueStr).dataUsingEncoding(NSUTF8StringEncoding)!)

body.appendData(NSString(format:"\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

}


//一个图片

body.appendData(NSString(format:"--"+boundary+"\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

//这一块是文件的名称

body.appendData(NSString(format:"Content-Disposition:form-data;name=\"file\";filename=\"dd.jpg\"rn").dataUsingEncoding(NSUTF8StringEncoding)!)

//这里是图片的格式

body.appendData(NSString(format:"Content-Type:image/png\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

body.appendData(NSString(format:"Content-Transfer-Encoding: binary\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

body.appendData(requestBody)

body.appendData(NSString(format:"\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)

letbottomStr ="--"+boundary+"--"

body.appendData(NSString(format:bottomStr).dataUsingEncoding(NSUTF8StringEncoding)!)


request.HTTPBody=body

CEProgressHUD.show()

let que=NSOperationQueue()

NSURLConnection.sendAsynchronousRequest(request, queue: que, completionHandler: {

(response, data, error) ->Voidin

if(error !=nil){

print(error)

}else{

//上传返回的状态

})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 由于iOS无法通过html表单来上传图片,因此想要上传图片,必须实现http请求,而不能像其他语言那样通过html...
    山杨阅读 2,362评论 1 6
  • +(NSString *)PostImagesToServer:(NSString *) strUrl dicPo...
    Daimer阅读 524评论 0 2
  • 这里不做多的介绍,直接上代码,有问题加QQ了解409961891 - (void)pause{ [self.upl...
    心在前方阅读 1,693评论 0 0
  • 时光不比人,它经不起一次次的辜负 堕落街的酒吧,音响里放着动感十足的舞曲,震耳欲聋,一群情绪高昂的学生正在随...
    苏州纪阅读 397评论 0 1
  • 近段时间 又重复了一遍《从你的全世界路过》知道我为什么喜欢这本书吗 因为这些,我从来就没经历过 我没有那样喜欢过一...
    南方的疯言阅读 272评论 0 0