2014-10-21 56 views
17

我正在用swift開發iPhone應用程序。並且我使用Alamofire framework來處理http請求。我用Alamofire.request的POST,GET和等這樣的:如何在Swift中使用Alamofire上傳參數圖像

Alamofire.request(.POST, myURL , parameters: ["a": "1", "b" : "2" ]) 
     .response { (request, response, data, error) in 
} 

而且我用Alamofire.upload上傳圖像到服務器這樣的:

Alamofire.upload(.POST, uploadURL , fileURL) 

而且兩者完美的作品,但現在我要上傳圖片併發送一些參數,我的內容類型應該是multipart/form-dataAlamofire.upload不接受參數。

上有兩個問題,以便了解這一問題迅速,這first one沒有使用Alamofire(真的,爲什麼不呢?),並在second onemattt(Alamofire開發)引用使用的編碼參數。

我檢查了他的例子,但仍然無法弄清楚如何做到這一點。

任何人都可以幫我解決這個問題嗎?

謝謝! :)

+0

這是我找到了解決辦法,貼到另一個問題: http://stackoverflow.com/questions/26121827/uploading-file-with -parameters-using-alamofire/26747857#26747857 – antiblank 2014-11-05 00:46:46

+0

Reza_Rg你能幫我嗎?我也使用'Alamofire.upload(.POST,uploadURL,fileURL)',但我該如何構造PHP文件來接收文件?文件通過我的php文件中的.POST發送到哪裏? – gutenmorgenuhu 2015-06-03 16:27:41

+0

@Reza_Rg你解決了你的問題嗎?如果是,你可以分享一個答案嗎? – user2363025 2015-06-16 13:40:27

回答

-3

要使用編碼參數,請創建一個ParameterEncoding變量,爲其分配一個編碼類型(enum包括.JSON,.URL),然後在您的NSURLRequest和參數中使用編碼函數。該函數返回兩個元素的元組,第一個元素是生成的NSURLRequest,第二個元素是可能的NSError。

以下是我用它爲一個自定義標題,我需要在一個項目

var parameterEncoding:ParameterEncoding! 
    switch method { 
     case .POST, .PUT : 
      parameterEncoding = ParameterEncoding.JSON 
     default : 
      parameterEncoding = ParameterEncoding.URL 
    } 
    var alamoRequest = Alamofire.Manager.sharedInstance.request(parameterEncoding.encode(mutableURLRequest, parameters: parameters).0) 
19

可以使用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":about, 
        "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) 
     } 
    }) 
} 
+0

這給我狀態碼415 – 2016-03-17 19:07:14

+0

HTTP錯誤415不支持的媒體類型PLZ檢查圖像類型@chamathjeevan – 2016-03-18 17:19:56

+0

如果在以下參數[「性別」:性別,「名字」:firstName,「dob」:dob中有一個鍵「圖像」 ,「aboutme」:aboutme,「token」:token,「lastName」:lastName,「image」:imageData]然後multipartFormData.appendBodyPart(data:imageData,name:「image」,fileName:「file.png」,mimeType: 「圖像/ PNG」)將附加在參數? – 2016-04-18 13:23:05

4

SWIFT 2 AlamoFire簡單的圖片上傳( REST API)

@amit gupta看起來答案包含大的開銷。 AlamoFire包含簡化解決方案的負載。 Alamofire.request方法包含幾個簡單的重載,可以用簡單的方式上傳。通過使用Alamofire.request(方法開發人員可以擺脫編碼開銷。

HTTP狀態415給出因爲沒有指定正確的介質類型。

請檢查下面我的解決方案。

import UIKit 
import Alamofire 

class ViewController: UIViewController { 

    @IBOutlet var imageView: UIImageView! 
    @IBOutlet var btnUpload: UIButton! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func successDataHandler(responseData:String){ 

     print ("IMAGE UPLOAD SUCCESSFUL !!!") 

    } 

    func failureDataHandler(errorData:String){ 

     print (" !!! IMAGE UPLOAD FAILURE !!! ") 

    } 

    @IBAction func actionUpload(sender: AnyObject) { 

     let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages" 

     let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!] 

     uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler) 
    } 

    func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) ->(),failureHandler: (String) ->()) ->() { 

     let headerData:[String : String] = ["Content-Type":"application/json"] 

     Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in 
      switch response.result { 
      case .Success: 
       print(response.response?.statusCode) 
       successHandler(response.result.value!) 
      case .Failure(let error): 
       failureHandler("\(error)") 
      } 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 
0

Almaofire與迅速2.0只是複製和粘貼如下從服務器code.here米asumming JSON響應

func uploadImageRemote (imageData : NSData?) -> Dictionary <String,AnyObject>{ 
    var imageDictionary = Dictionary<String,AnyObject>() 

     var tokenHeaders:[String:String]! = ["x-access-token":Constants.kUserDefaults.stringForKey("userToken")!] 
    Alamofire.upload(
     .POST, 
     "http://52.26.230.146:3300/api/profiles/imageUpload",headers:tokenHeaders, 
     multipartFormData: { multipartFormData in 
      multipartFormData.appendBodyPart(data: imageData!, name: "upload", fileName: "imageFileName.jpg", mimeType: "image/jpeg") 
     }, 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .Success(let upload, _, _): 
       upload.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in 
        print("Uploading Avatar \(totalBytesWritten)/\(totalBytesExpectedToWrite)") 
        dispatch_async(dispatch_get_main_queue(),{ 

        }) 
       } 
       upload.responseJSON { response in 
        guard response.result.error == nil else { 
         print("error calling GET \(response.result.error!)") 
         return 
        } 

        if let value = response.result.value { 
         print("Success JSON is:\(value)") 
         if let result = value as? Dictionary<String, AnyObject> { 
          imageDictionary["imageUrl"] = result["url"] 
         } 
        } 

        dispatch_async(dispatch_get_main_queue(),{ 
         //Show Alert in UI 
         print("Avatar uploaded"); 
        }) 
       } 

      case .Failure(let encodingError): 
       //Show Alert in UI 
       print("Avatar not uploaded \(encodingError)"); 
      } 
     } 
    ); 



return imageDictionary 
} 
3

Almaofire與迅速3。0

Alamofire.upload(multipartFormData: { multipartFormData in 
    var index = 1 
    for image in imageArray { 
     let imageData: Data = (UIImageJPEGRepresentation(image, 1.0) as Data?)! 

     multipartFormData.append(imageData, withName: "home-\(index)", fileName: "home-\(index)", mimeType: "image/jpeg") 

     index += 1 
    } 
    }, with: requestName, encodingCompletion: { result in 
     switch result { 
     case .success(let upload, _, _): 

      upload.responseJSON { response in 
       print("Image(s) Uploaded successfully:\(response)") 
      } 
     case .failure(let encodingError): 
      print("encodingError:\(encodingError)") 
     } 
}) 
+0

我的問題是圖像名稱和目錄如何實現圖像中的圖像畫廊目錄和他們的名字? – 2017-08-22 11:21:20

-1

斯威夫特4 Alamofire 4

let isConnected = connectivity.isConnectedToInternet() 

    func updateProfile(firstName:String,lastName:String ,imageData:Data?,completion: @escaping (isValidUser)->()) { 


    if self.isConnected { 

     var parameters : [String:String] = [:] 
     parameters["auth_key"] = loginUser?.authKey! 
     parameters["User[first_name]"] = firstName 
     parameters["User[last_name]"] = lastName 

     let url = "\(baseUrl)\(basicAuthenticationUrl.updateProfile)" 
     print(url) 


     Alamofire.upload(multipartFormData: { (multipartFormData) in 
      for (key, value) in parameters { 
       multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String) 
      } 

      if let data = imageData { 
       multipartFormData.append(data, withName: "image_url", fileName: "image.png", mimeType: "image/png") 
      } 

     }, usingThreshold: UInt64.init(), to: url, method: .post) { (result) in 
      switch result{ 
      case .success(let upload, _, _): 
       upload.responseJSON { response in 
        print("Succesfully uploaded = \(response)") 
        if let err = response.error{ 

         print(err) 
         return 
        } 

       } 
      case .failure(let error): 
       print("Error in upload: \(error.localizedDescription)") 

      } 
     } 
    } 

} 
相關問題