2017-10-09 46 views
0

我想在API調用中從圖庫向服務器發送圖像。該圖像必須作爲參數傳遞。要通過圖像作爲參數,我試圖讓圖像的URL像這樣,但它並沒有給予正確的URL ..使用Alamofire無法正常工作將圖像上傳到服務器

var selectedImage : UIImage = image 
let imageData: NSData = UIImagePNGRepresentation(selectedImage)! as NSData 
let imageStr = imageData.base64EncodedString(options:.endLineWithCarriageReturn) 
imageArray.append(image) 

而且我試着上傳的圖片是這樣的...

 for img in imageArray { 

      let url = "http://myApp..com/a/images_upload" 
      let headers = [ "Content-Type":"application/x-www-form-urlencoded"] 

      let URL = try! URLRequest(url: url, method: .post, headers: headers) 
      let parameters = 
       [ 
        "access_token": accessToken 
        "image": img 
        ] as [String : Any] 


      let imgData = UIImageJPEGRepresentation(img, 0.2)! 

      Alamofire.upload(multipartFormData: { (multipartFormData) in 
       multipartFormData.append(imgData, withName: "image",fileName: "file.jpg", mimeType: "file") 
       for (key, value) in parameters { 
        multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) 
       } 
      }, with: URL) { (result) in 
       switch result { 
       case .success(let upload, _, _): 

        upload.uploadProgress(closure: { (progress) in 
         print("Upload Progress: \(progress.fractionCompleted)") 
        }) 

        upload.responseJSON { response in 
         print(response.result.value) 
         if let value = response.result.value {         
          print("IMG UPLOADED!!!") 
         } 
        } 
        case .failure(let encodingError): 
        print(「ERROR」) 
}}} 

但是這也是崩潰。我一直有這個問題相當長一段時間了......無法弄清楚確切的解決方案是什麼......希望有人可以幫助... :)也做過很多類似的問題。但沒找到,直到一個解決方案...

編輯:我的參數是:

let Parameters = 
        [ 
         "access_token": commonVarForAccessToken, 
         "seller_id": idForNewOldUser, 
         "product_id": self.productId, 
         "is_default": "1", 
         "sequence": 1, 
         "image": self.localPath 
         ] as [String : Any] 
+0

https://stackoverflow.com/questions/39631823/swift-3-alamofilre-4-0-multipart-image-upload-with-progress和https://stackoverflow.com/questions/39809867/alamofire-4-upload-with-parameters – iPatel

+0

確實經歷過之前,@iPatel ...但它沒有幫助... –

+0

使用我的答案https:/ /stackoverflow.com/questions/45651187/upload-photo-file-with-json-and-custom-headers-via-swift-3-and-alamofire-4-i/46116478#46116478只需將密鑰在密鑰字典中傳遞 –

回答

0

使用此功能時作出的URLRequest。

func makeUrlRequestWithComponents(urlString:String, parameters:Dictionary<String, Any>, imageData:NSData) -> (URLRequestConvertible, NSData) { 

// create url request to send 
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!) 
mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue 
let boundaryConstant = "myRandomBoundary12345"; 
let contentType = "multipart/form-data;boundary="+boundaryConstant 
mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type") 



// create upload data to send 
let uploadData = NSMutableData() 

// add image 
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
uploadData.appendData(imageData) 

// add parameters 
for (key, value) in parameters { 
    uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!) 
} 
uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 



// return URLRequestConvertible and NSData 
return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData) 
} 

然後這是上傳圖片的功能。

func uploadImage() 
{ 

    let Parameters = 
    [ 
"access_token": commonVarForAccessToken, 
"seller_id": idForNewOldUser, 
"product_id": self.productId, 
"is_default": "1", 
"sequence": 1, 
] as [String : Any] 


// example image data 

let imageData = UIImagePNGRepresentation(myImageView.image!,1) 



// CREATE AND SEND REQUEST ---------- 

let urlRequest = makeUrlRequestWithComponents("http://myApp..com/a/images_upload", parameters:  parameters, imageData: imageData) 

    Alamofire.upload(urlRequest.0, urlRequest.1).progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in 
    println("\(totalBytesWritten)/\(totalBytesExpectedToWrite)") 
} 
.responseJSON { (request, response, JSON, error) in 
    println("REQUEST \(request)") 
    println("RESPONSE \(response)") 
    println("JSON \(JSON)") 
    println("ERROR \(error)") 
    } 
} 
+0

謝謝@Zee,但我從圖庫中選擇圖像。那麼這張圖片不應該先轉換成它的網址......? –

+0

您可以從圖庫中選擇圖像並將其分配給UIImageView,然後在該函數中使用該圖像 – Zee

+0

,並且已經給出了要上傳的圖像的正確文件名,例如... imageFileName.jpg。但是如果我從圖庫中選擇一張圖片,那麼這張圖片就不會有這樣一個明確的名字。那麼在這種情況下我們該怎麼做......? –

0

Almofire隨着圖像: -

Alamofire.upload(multipartFormData: { (multipartFormData) in 
      print(parameters) 
      if Array(parameters.keys).contains(Keys.Image) { 
      multipartFormData.append(UIImageJPEGRepresentation((parameters)[Keys.Image] as! UIImage, 1)!, withName: "image", fileName: "swift_file.jpeg", mimeType: "image/jpeg") 
      } 
      for (key, value) in parameters { 
       print(key,value) 
       if key != Keys.Image{ 
       multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) 
       } 
      } 
     }, to:url) 
     { (result) in 
      switch result { 
      case .success(let upload, _, _): 
       upload.uploadProgress(closure: { (progress) in 
        //Print progress 
       }) 
       upload.responseJSON { response in 
        print(response.result) 
        self.getValidDict(result: response.result, completion: { (dict, error) in 
         var dict = dict 
         print(dict!) 
         print(parameters) 
         if dict == nil { 
          dict = NSDictionary.init(dictionary: 
           [kResultMessageKey: error?.localizedDescription ?? "Some error has been occured", 
           kResultStatusKey: false]) 
         } 
          Completion(true,dict![Keys.result]! as AnyObject) 
        }) 
       } 
      case .failure(let encodingError): 
       //print(encodingError.description) 
       Completion(false,encodingError.localizedDescription as AnyObject) 
       break 
      } 
     } 
+0

..什麼是keys在Keys.Image裏面??不能使這個出來:) :) –

+0

參數是一個包含key - >「image」的圖像的dicionary,所以鍵是包含這些鍵的結構 –

相關問題