上傳圖片在網(wǎng)頁中最常用的就是POST請求了,將圖片編碼到POST請求體(body)中,通過請求數(shù)據(jù)一起發(fā)送到服務(wù)器上,下面的代碼就是POST請求上傳圖片。
在iOS開發(fā)中,圖片上傳的請求體非常難寫,格式要求非常嚴(yán)格,出一點(diǎn)錯(cuò)誤都會(huì)造成上傳失敗,或請求數(shù)據(jù)失敗,先看格式:
--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--
這是一個(gè)不帶其他任務(wù)參數(shù),body中只有一張圖就要寫成這樣
分別說明一下:
--Boundary+72D4CD655314C423? ?//分割符,以“--”開頭,后面的字隨便寫,只要不寫中文即可
Content-Disposition: form-data;
name="uploadFile"; filename="001.png"??//這里注明服務(wù)器接收圖片的參數(shù)(類似于接收用戶名的userName)及服務(wù)器上保存圖片的文件名
Content-Type:image/png??//圖片類型為png
Content-Transfer-Encoding: binary??//編碼方式
//這里是空一行,必不可少!!
... contents of boris.png ...??//圖片數(shù)據(jù)部分
--Boundary+72D4CD655314C423--??//分隔符后面以"--"結(jié)尾,表明結(jié)束
3、如果有其他表單數(shù)據(jù),如傳用戶ID等參數(shù),也要寫成以上格式:
--Boundary+72D4CD655314C423
Content-Disposition: form-data; name="userId"
254
--Boundary+72D4CD655314C423
Content-Disposition: form-data; name="shopId"
18718
具體參數(shù)含義與圖片一致,一般這段會(huì)在圖片上面,因此沒有結(jié)尾符,如果沒有其他數(shù)據(jù)了,那要加上結(jié)尾符。
下面是具體的代碼:
let request=NSMutableURLRequest(URL:NSURL(string:url)!)
request.HTTPMethod="POST"http://設(shè)置請求方式
//分割標(biāo)識(shí)
let boundary:String="BOUNDARY"
//上傳文件必須設(shè)置
let contentType:String="multipart/form-data;boundary="+boundary
request.addValue(contentType, forHTTPHeaderField:"Content-Type")
let body=NSMutableData()
//parameter是一個(gè)帶有key, value的字典,這是所帶的參數(shù)
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)!)
}
//一個(gè)圖片
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{
//上傳返回的狀態(tài)
})