swift之原生文件上传

作者: CGPointZero | 来源:发表于2016-01-12 12:38 被阅读1274次

最近,微信有个好友,是从简书上认识的。他说文件上传不会做,让我帮忙,反正闲的没事,就研究了一下。其实用OC是非常简单的事情,这里翻译成swift,供新学swift参考,也方便自己今后查阅-.-

upload.swift

<pre>
import UIKit

//分界标识
let boundaryStr="--"
let boundaryID="haha"

//上传文件的方法
func uploadFileToHost(urlString:String,name:String,fileName:String,mimeType:String,paramters:String?,fileData:NSData, sucess :(NSData?)->Void, failure :(NSError?)->Void ){

if urlString.isEmpty{
    print ("主地址不能为空")
    return
}
//固定拼接的第一部分
let top=NSMutableString()
top.appendFormat("%@%@\r\n", boundaryStr,boundaryID)
top.appendFormat("Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name,fileName)
top.appendFormat("Content-Type: %s\r\n\r\n", mimeType)

//固定拼接第三部分
let buttom=NSMutableString()
buttom.appendFormat("%@%@\r\n", boundaryStr,boundaryID)
buttom.appendString("Content-Disposition: form-data; name=\"submit\"\r\n\r\n")
buttom.appendString("Submit\r\n")
buttom.appendFormat("%@%@--\r\n", boundaryStr,boundaryID)

//拼接
let fromData=NSMutableData()
//非文件参数
if (paramters != nil){
    fromData.appendData((paramters?.dataUsingEncoding(NSUTF8StringEncoding))!)
}
fromData.appendData(top.dataUsingEncoding(NSUTF8StringEncoding)!)
fromData.appendData(fileData)
fromData.appendData(buttom.dataUsingEncoding(NSUTF8StringEncoding)!)

//可变请求
let requset=NSMutableURLRequest(URL: NSURL(string: urlString)!)
requset.HTTPBody=fromData
requset.HTTPMethod="POST"
requset.addValue(String(fromData.length), forHTTPHeaderField:"Content-Length")
let contype=String(format: "multipart/form-data; boundary=haha", boundaryID)
requset.setValue(contype, forHTTPHeaderField: "Content-Type")

let session=NSURLSession.sharedSession()
session.uploadTaskWithRequest(requset, fromData: nil) { (responseData, response, error) -> Void in
    if error==nil{
        sucess(responseData)
    }
    else{
        failure(error)
    }
}.resume()

}
</pre>

只有这一个方法,下面来看一下怎么用:
我在工程里有一张名为“1.png”的图片,直接调用这个方法就可以了,可以看到服务器返回上传成功,亲测可行~

ViewController.swift

<pre>

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    let path=NSBundle.mainBundle().pathForResource("1", ofType:"png")
    let data=NSData(contentsOfFile: path!)
    let host="http://games.kmbopai.com/Services/UserInfoService.asmx/UploadFile"
    
    uploadFileToHost(host, name: "media", fileName: "1.png", mimeType: "image/png", paramters: nil, fileData: data!, sucess: { (responseData) -> Void in
    
        let result=String(data: responseData!, encoding: NSUTF8StringEncoding)
        print(result)
    }){ (error) -> Void in
    }
}

}
</pre>

控制台打印如下信息:
Optional("<?xml version="1.0" encoding="utf-8"?>\r\n<string xmlns="http://games.kmbopai.com/Services/">{"status": 1, "msg": "****上传文件成功!****", "name": "1.png", "path": "/upload/201601/12/201601121237134502.png", "thumb": "/upload/201601/12/thumb_201601121237134502.png", "size": 73053, "ext": "png"}</string>")

相关文章

网友评论

  • 冷大大_hawkleng:这个貌似只是文件上传,如果把参数也带上就更完美了:smiley:
  • 8c13d33d031a:怎么上传图库随机不确定名字和类型的图片呢?
    CGPointZero:@江小南 这个很简单啊,用NSURLConnection发送本地文件路径对应的URL请求,在response中有个content-type的东西 ,就是MIMEType,文件名可以随便起。

本文标题:swift之原生文件上传

本文链接:https://www.haomeiwen.com/subject/yjfckttx.html