2017-09-06 74 views
1

我使用Alamofire上傳圖片,但上傳失敗。
我還將令牌&參數帶到服務器。
我不知道我是否正確添加標記&參數。
我使用Alamofire有什麼問題?
有什麼建議嗎? 謝謝。
如何使用帶有標記和參數的Alamofire上傳圖像?

func uploadWithAlamofire(image:UIImage, imageData:Data, imageUrl:URL) {   
    let parameters = ["avatar":imageData] 

    Alamofire.upload(multipartFormData: { multipartFormData in 
     multipartFormData.append(imageData, withName: user.id, fileName: "\(user.id).jpg", mimeType: "image/jpg") 

     for (key, value) in parameters { 
      multipartFormData.append(value, withName: key) 
     } 
    }, to: apiUrl , method: .put, headers: ["Authorization": "Bearer \(token)"], 
      encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .success(let upload, _, _): 
        upload.response { [weak self] response in 
         guard self != nil else { 
          return 
         } 
         debugPrint(response) 
        } 
       case .failure(let encodingError): 
        print("error:\(encodingError)") 
       } 
    }) 
} 


func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    photoImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
    photoImageView.image = photoImage 

    let imageName:String = user.id + ".jpg" 
    let documentsPath = NSHomeDirectory().appending("/Documents/Icon/") 
    let imagePath = documentsPath.appending(imageName) 
    let imageUrl = URL(fileURLWithPath: imagePath) 
    print("imageUrl is here:\(imageUrl)") 

    let imageData:Data = UIImageJPEGRepresentation(photoImage, 0.001)! 

    do { 
     try imageData.write(to: imageUrl,options: .atomic) 
    } catch let error { 
     print(error) 
    } 

    uploadWithAlamofire(image: photoImage, imageData: imageData, imageUrl: imageUrl) 

    self.dismiss(animated: true, completion: nil) 
} 
+0

請檢查它是否有效。 https://stackoverflow.com/questions/47151184/swift-http-load-failed-error-code-1005-4-4-while-uploading-image-throu –

回答

0

使用此功能上傳圖像與令牌服務器和參數

func uploadImageAndData(){ 

var parameters = [String:AnyObject]() 
parameters = ["token": token, 
       "Name": Name] 

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) 
    } 
})} 

作品爲Alamofire 3.0+

+0

如果我的參數帶來[String:Data]就像我的例子。 for(key,value)in parameters {multipartFormData.appendBodyPart(data:value.dataUsingEncoding(NSUTF8StringEncoding)!, name:key)}。值沒有數據使用編碼 –

1

試試這個:

func uploadImageWith(param params:Dictionary<String,String>,image:UIImage?,handler:@escaping ((Dictionary<String,Any>?,Int) -> Void)) { 
    // let keyJson = "json".dataUsingEncoding(NSUTF8StringEncoding)! 
    print("Params:\(params)") 
    let BASE_URL = "http://" 
    Alamofire.upload(
     multipartFormData: { multipartFormData in 
      for (key, value) in params { 
       multipartFormData.append(value.data(using: String.Encoding.utf8, allowLossyConversion: false)!, withName: key) 
      } 

      if image != nil{ 
       let imgData = UIImageJPEGRepresentation(image!, 0.5) 
       if imgData != nil { 
        multipartFormData.append(imgData!, withName: "photo_upload", fileName: "file.png", mimeType: "image/png") 
       } 
      } 
    }, 
     to: BASE_URL, 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
       upload.responseJSON { response in 

        switch response.result { 
        case .success: 
         if let jsonDict = response.result.value as? Dictionary<String,Any> { 
          print_debug("Json Response: \(jsonDict)") // serialized json response 
          handler(jsonDict,(response.response!.statusCode)) 
         } 
         else{ 
          handler(nil,(response.response!.statusCode)) 
         } 
         if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 
          print("Server Response: \(utf8Text)") // original server data as UTF8 string 
         } 
         break 
        case .failure(let error): 
         handler(nil,(response.response!.statusCode)) 
         break 
        } 
       } 
      case .failure(let encodingError): 
       print(encodingError) 
      } 
    } 
    ) 
} 

使用

uploadImageWith(param: ["key":"value"], image: UIImage(name:"icon")) { (response, statusCode) in 
    print(response) 
} 

你必須通過PARAMS和圖像對象,你會得到響應,如關閉Dictionary對象。

相關問題