【问题标题】:How to upload image using Alamofire with token&parameters?如何使用带有令牌和参数的 Alamofire 上传图像?
【发布时间】:2018-02-14 14:59:48
【问题描述】:

我使用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)
}

【问题讨论】:

标签: ios swift file-upload alamofire


【解决方案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)
}

您必须传递参数和图像对象,然后才能在闭包中以 Dictionary 对象的形式获得响应。

【讨论】:

    【解决方案2】:

    使用该函数上传图片到服务器,带有token和参数

    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+

    【讨论】:

    • 如果我的参数像我的例子一样带来 [String:Data]。 for (key, value) 在参数 {multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)} 中。值没有数据usingEncoding
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2014-12-17
    • 2018-03-09
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多