Не удается загрузить изображение с помощью Alamofire - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь загрузить изображение, используя Alamofire, вот так ...

func callImageUploadAPI() {

    for i in ArrayData.shared.imageAndIDDictArray {

        let id = "\(i["id"]!)"

        let url = "http://api-the-upload-api/api/observation/uploadImage/\(id)"
        let headers = [

            "Accept": "application/json",
            "Authorization": theToken

        ]

            let parameters: [String: String]  =
                [
                    "id": "\(i["id"]!)"
            ]

            Alamofire.upload(multipartFormData: {(multipartFormData) in
                let filePath = NSURL(fileURLWithPath: url)

                let type = "image/jpg"
                var image = "\(i["image"]!)"
                var imageData = Data(image.utf8)
                imageData.append(("Content-Type: \(type)").data(using: .utf8)!)

                multipartFormData.append (imageData, withName: "file", fileName: "\(Date().timeIntervalSince1970).jpg", mimeType: "image/jpg")

                for (key, value ) in parameters {
                    print(key,value)

                    multipartFormData.append(value.data(using: .utf8)!, withName: key)
                }
            }, to: url, method: .post, headers: headers)
            { (result) in
                switch result {
                case .success(let upload, _,_ ):


                    upload.uploadProgress(closure: { (progress) in
                        UILabel().text = "\((progress.fractionCompleted * 100)) %"
                        print (progress.fractionCompleted * 100)

                    })
                    upload.responseJSON { response in 

                        if let JSON = response.result.value {
                            print(JSON) //SHOWS THE ERROR 'Only images files are allowed' 
                        }else{
                            print("Error")
                        }
                    }
                case .failure(let encodingError):
                    print(encodingError)
                    break
                }
            }


    }

}

Но при такой загрузке изображение не загружается. Тем не менее, я могу go к блоку успеха. Но внутри блока успеха печатается JSON Only images files are allowed. Не уверен, почему это происходит.

Но когда я нажимаю на запрос POSTMAN, загружая изображение, оно загружается правильно ..

1 Ответ

0 голосов
/ 03 февраля 2020

хорошо я пишу этот ответ, чтобы вы могли настроить свой код. поэтому

во-первых, я рекомендую вам создать функцию, которая получает данные изображения с заголовками URL. например.

func uploadPictureUser(headers: [String:String], image:Data, completion: @escaping ((Bool) -> Void))
    {
        alamoFireManager!.upload(multipartFormData: { (MultipartFormData) in
            MultipartFormData.append(image, withName: "NAME-PARAM-ENDPOINT", fileName: "NAMEIMAGE", mimeType: "image/png")
        }, usingThreshold: UInt64.init(), to: "URL ENDPOINT IMAGE", method: .post, headers: headers)
        { (result) in
            switch result{
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    if let _ = response.result.value as? [String:Any]{
                        completion(true)
                        return
                    }
                    completion(false)
                }
            case .failure( _):
                completion(false)
            }
        }
    }

в этом примере у fleName нет расширения, конечной точке не нужен параметр, но включены заголовки

, теперь как мне преобразовать изображение в данные? Я создал этот забавный c, потому что иногда изображение является самым большим для загрузки, и теперь вы можете изменить его качество

enum JPEGQuality: CGFloat {
        case lowest  = 0
        case low     = 0.25
        case medium  = 0.5
        case high    = 0.75
        case highest = 1
    }

    func jpeg(_ jpegQuality: JPEGQuality) -> Data? {
        return jpegData(compressionQuality: jpegQuality.rawValue)
    }

, вы можете использовать этот код следующим образом.

qualityImage = yourImage.jpeg(.medium)
let headers = [
    "Authorization" : "JWT " + userProfile.login.userLoginHome!.token
]

uploadPictureUser(headers: headers, image: qualityImage) { (flag) in
    if flag{
       print("image was uploaded")
    } else{
       print("error")
    }
}

Итак, я надеюсь, что этот код поможет вам правильно. С уважением

...