上传图片在网页中最常用的就是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{
//上传返回的状态
})