Как конвертировать UIImage в JPEG без потери данных EXIF? - PullRequest
0 голосов
/ 10 марта 2020

В настоящее время я работаю над iOS приложениями и использую многочастную загрузку изображений для загрузки изображений на сервер. Ниже приведен мой метод загрузки изображений.

func uploadImageData(imageType:Int, uploadId:String, fileName:String, imageFile:UIImage, completion:@escaping (APIResponseStatus, ImageUploadResponse?) -> Void) {

        let image = imageFile
        let imgData = image.jpegData(compressionQuality: 0.2)!

        let params = [APIRequestKeys.imageType:imageType, APIRequestKeys.uploadId:uploadId, APIRequestKeys.fileName:fileName] as [String : Any]
        //withName is the post request key for the image file
        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(imgData, withName: APIRequestKeys.imageFile, fileName: "\(fileName).jpg", mimeType: "image/jpg")
                for (key, value) in params {
                    multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key)
                }
        }, to: Constants.baseUrl + APIRequestMetod.uploadImageData, headers:self.getImageUploadHeaders())
            { (result) in
                switch result {
                case .success(let upload, _, _):
                    APIClient.currentRequest = upload
                    upload.uploadProgress(closure: { (progress) in
                    })
                    upload.responseObject {
                        (response:DataResponse<ImageUploadResponse>) in
                        switch response.result {
                        case .success(_):
                            completion(APIClient.APIResponseStatus(rawValue: (response.response?.statusCode)!)!, response.value!)
                        case .failure(let encodingError):
                            if let err = encodingError as? URLError, err.code == .notConnectedToInternet {
                                completion(APIClient.APIResponseStatus.NoNetwork, nil)
                            } else {
                                completion(APIClient.APIResponseStatus.Other, nil)
                            }
                        }
                    }
                case .failure( _):
                    completion(APIClient.APIResponseStatus.Other, nil)
                }
            }
        }

Но для этой реализации сервер всегда отправляет exif data error. Вот ошибка, которую я получаю.

exif_read_data(A029C715-99E4-44BE-8691-AA4009C1F5BD_FOTOPREGUNTA.ico): Illegal IFD size in
upload_image_xhr.php on line

Важно то, что этот сервис работает без ошибок в приложениях POSTMAN и android. Эта ошибка появляется только для моей iOS реализации. Мой бэкэнд-разработчик сказал мне, что в данных, которые я отправляю, есть и exif-ошибка данных, и, пожалуйста, проверьте данные со своей стороны. У кого-нибудь есть идеи по этому поводу? Заранее спасибо.

1 Ответ

0 голосов
/ 11 марта 2020

Я сделаю функцию блокировки для загрузки изображения на сервер, используя Multipart

//Here strUrl = YOUR WEBSERVICE URL
//postParam = post Request parameter i.e. 
//let postParam : [String : Any] = [first_name : "name"]
//imageArray = image upload array i.e.
//var imageArray : [[String:Data]] = [["image_name" : YOUR IMAGE DATA]]

func postImageRequestWithURL(withUrl strURL: String,withParam postParam: Dictionary<String, Any>,withImages imageArray:[[String:Data]], completion:@escaping (_ isSuccess: Bool, _ response:NSDictionary) -> Void)
{
    let requetURL = strURL

    Alamofire.upload(multipartFormData: { (MultipartFormData) in

        for (imageDic) in imageArray
        {
            for (key,valus) in imageDic
            {
                MultipartFormData.append(valus, withName:key,fileName: "file.jpg", mimeType: "image/jpg")
            }
        }

        for (key, value) in postParam
        {
            MultipartFormData.append("\(value)".data(using: .utf8)!, withName: key)

          // MultipartFormData.append(value, withName: key)
        }

    }, usingThreshold: UInt64.init(), to: requetURL, method: .post, headers: ["Accept": "application/json"]) { (result) in

        switch result {
        case .success(let upload, _, _):

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

            upload.responseJSON { response in

                let desiredString = NSString(data: response.data!, encoding: String.Encoding.utf8.rawValue)

                print("Response ====================")

                print(desiredString!)

                if let json = response.result.value as? NSDictionary
                {
                    if response.response?.statusCode == 200
                        || response.response?.statusCode == 201
                        || response.response?.statusCode == 202
                    {
                        completion(true,json);
                    }
                    else
                    {
                        completion(false,json);
                    }
                }
                else
                {
                    completion(false,[:]);
                }
            }

        case .failure(let encodingError):
            print(encodingError)

            completion(false,[:]);
        }

    }
}

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...