2016-01-20 28 views
7

首先,我想說我對swift很陌生,知道一點。因此,任何幫助都會被處理。我有一個具有圖像(profile-image),一些參數(名字,姓氏)和頭部(userid,hashCode)的多部分數據表單。我想發送POST請求來提交表單。Multipart-form(圖片,參數,標題)以快速發送Alamofire的請求

我已經能夠使POST請求只,頭和其他參數除了形象:

let headers = [ 
     "user_id": (Helper.getUserInfo()?.user_id)!, 
     "hash_code":(Helper.getUserInfo()?.hash_code)!, 
    ] 
let params = [ 
     "name": self.name.text!, 
     "address":self.address.text!] 


    Alamofire.request(.POST, kFormUrl, parameters:params ,headers:headers).responseJSON { [weak self] response in 

//working fine 
} 

但如何發送圖像文件(不根據-64string),即直接的文件上傳與參數和標題。

在此先感謝

回答

8

可以使用Alamofire 3.0+下面的代碼

func uploadImageAndData(){ 
//parameters 
let gender = "M" 
let firstName = "firstName" 
let lastName = "lastName" 
let dob  = "11-Jan-2000" 
let aboutme = "aboutme" 
let token  = "token" 


var parameters = [String:AnyObject]() 
parameters = ["gender":gender,"firstName":firstName,"dob":dob,"aboutme":aboutme,"token":token,"lastName":lastName] 

let URL = "http://yourserviceurl/" 
let image = UIImage(named: "image.png") 

Alamofire.upload(.POST, URL, multipartFormData: { 
    multipartFormData in 
if let imageData = UIImageJPEGRepresentation(image, 0.6) { 
multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png") 
} 
for (key, value) in parameters { 
multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
} 
}, encodingCompletion: { 
encodingResult in 

switch encodingResult { 
    case .Success(let upload, _, _): 
    print("s") 
    upload.responseJSON { response in 
     print(response.request) // original URL request 
     print(response.response) // URL response 
     print(response.data)  // server data 
     print(response.result) // result of response serialization 

     if let JSON = response.result.value { 
      print("JSON: \(JSON)") 
     } 
} 

    case .Failure(let encodingError): 
    print(encodingError) 
    } 
}) 
} 
+5

Alamofire 4.0示例? –

+1

如何在Almofire 3.0中的多表單數據中添加標題? – ChanWarde

+0

轉到此鏈接https://github.com/Alamofire/Alamofire#http-headers @ChanWarde –

0
let userImageURL = NSURL(string: "your image url" as String) 
     let data = NSData.init(contentsOfURL: userImageURL!) 


Alamofire.upload(
       .POST,registerUrl!, 
       multipartFormData: { multipartFormData in 

       multipartFormData.appendBodyPart(data:"N".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"flag") 

       multipartFormData.appendBodyPart(data: data!, name: "image", fileName: "pic.jpg", mimeType: "image/png") 

multipartFormData.appendBodyPart(data: facebookId.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"facebook_id") 

       multipartFormData.appendBodyPart(data: nameString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"first_name") 


}, 
       encodingCompletion: { encodingResult in 
        switch encodingResult { 
        case .Success(let upload, _, _): 
         upload.responseJSON { response in 
          print(response) 
          let dict = response.result.value as! NSDictionary 

         } 
        case .Failure(let encodingError): 
         print(encodingError) 
        } 
       } 
      ) 
0

我用Alamofire(雨燕2.3)與進步送多。

func upload(URLRequest: Router, onProgress: (progress: Float?) -> Void, completion: (json: AnyObject?, error: Error?) -> Void) { 
    let headers:[String: String] = [:] 

    let router = URLRequest.URLRequest 
    let tuple = URLRequest.parameters 
    let parameters = tuple.0! 
    let imagesData = tuple.1 
    let url = router.URLString 

    self.manager!.upload(
     .POST, 
     url, 
     headers: headers, 
     multipartFormData: { (multipartFormData: MultipartFormData) -> Void in 
      for value in imagesData { 
       var mimeType = "video/jpg" 
       var bodyName = "images" 
       let filename = value.uniqueName 
       if value.mediaType == ReporterMediaType.image { 
        mimeType = "image/jpg" 
        bodyName = "images" 
       } else if value.mediaType == ReporterMediaType.video { 
        mimeType = "video/quicktime" 
        bodyName = "video" 
       } else if value.mediaType == ReporterMediaType.videoFrame { 
        mimeType = "image/jpg" 
        bodyName = "videoFrame" 
       } 
       multipartFormData.appendBodyPart(
        data: value.data, 
        name: bodyName, 
        fileName: filename, 
        mimeType: mimeType) 
      } 
      for (key, value) in parameters { 
       multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
      } 
     }, 
     encodingCompletion: { (encodingResult) -> Void in 
      switch encodingResult { 
      case .Success(let upload, _, _): 
       upload.responseJSON { response in 
        if response.result.isSuccess || response.response?.statusCode == 200 { 
         completion(json: upload, error: nil) 
        } else { 
         dispatch_async(dispatch_get_main_queue()) { 
          completion(json: nil, error: response.result.error) 
         } 
        } 
       } 
       upload.progress { _, totalBytesRead, totalBytesExpectedToRead in 
        let progress = Float(totalBytesRead)/Float(totalBytesExpectedToRead) 
        onProgress(progress: progress) 
       } 
      case .Failure: 
       UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
       break 
      } 
    }) }