использование Alamofire 5 для загрузки файла на сервер RocketChat - PullRequest
1 голос
/ 21 июня 2020

Я использую Alamofire 5 и пытаюсь загрузить изображение на сервер Rocket Chat. Соответствующий оператор curl, который мне нужно продублировать с помощью AF, находится по следующей ссылке: (ссылка на документацию: https://docs.rocket.chat/api/rest-api/methods/rooms/upload)

Я безуспешно пытался загрузить с помощью multipartFormData . Я также попытался полностью обойти Alamofire и использовать Swift URLSession. Лучшее, что я могу сделать, это получить то же сообщение об ошибке от сервера, которое называется «errorType»: invalid-field. »

Мой код в его нынешнем виде:

let url = URL_MESSAGES + "rooms.upload/\(_group._id ?? "")"
    
let boundary = UUID().uuidString

let headers: HTTPHeaders = [
    
"X-Auth-Token": authToken,
    "X-User-Id": me._id ?? "",
    "Content-type":"multipart/form-data; boundary=\(boundary)"
]

if let data = image.jpeg(.medium) {
        
    print(data.count)
        
    AF.upload(
        multipartFormData: { multipartFormData in
                multipartFormData.append(data, withName: "image", fileName: "image.jpeg", mimeType: "image/jpeg")
        },
            to: url, method: .post , headers: header)
            .response { resp in
                print(resp)

        }
        .cURLDescription { description in
            print(description)
        }
        .responseString { [weak self] (response) in
            
            DispatchQueue.main.async {                 
                if response.error == nil {
                    
                    guard let data = response.data else {
                        return completion(true,[:])
                    }

                    if let json = try? JSON(data: data) {

                        let dictionaryIn = json.rawValue as! [String : Any]

                        if (self?.isSuccess(data: dictionaryIn))! {
                            completion(true,json.rawValue as! [String : Any])
                        }else{
                            completion(false,[:])
                            self?.handleError(data: dictionaryIn)
                        }
                    }

                }else{
                        completion(false,[:])
                        self?.handleError(data: [:])
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 27 июня 2020

Приведенный выше код работает отлично, когда я изменил это:

 AF.upload(
    multipartFormData: { multipartFormData in
            multipartFormData.append(data, withName: "image", fileName: "image.jpeg", mimeType: "image/jpeg")

на:

 AF.upload(
    multipartFormData: { multipartFormData in
            multipartFormData.append(data, withName: "file", fileName: "image.jpeg", mimeType: "image/jpeg")

Замена «изображения» на «файл» все исправила. Я выбрал «имидж», потому что это то, что я мог найти в каждом учебнике по Alamofire. Однако RocketChat требует, чтобы он был «файловым». Это есть в документации, но я не понимал, что он мне велел делать. В частности, в документации сказано:

"Примечание. Для некоторых типов файлов при загрузке через curl вам может потребоваться установить тип mime. Для некоторых типов файлов curl загрузит файл как application / octet- Вы можете передать настраиваемый тип mime следующим образом: -F "file=@file.wav;type=audio / wav" "

Я пробовал -F" image=@file.wav;type=audio / wav "при переводе из Alamofire. Это должно быть: -F "file=@file.wav;type=audio / wav"

0 голосов
/ 21 июня 2020

Я думаю, вы нарушаете загрузку, пытаясь установить свои собственные границы. Alamofire сделает это за вас автоматически. Попробуйте удалить шапку.

...