Как загрузить изображение, используя многокомпонентные данные alamofire с базовой аутентификацией? - PullRequest
0 голосов
/ 14 мая 2018

Я новичок в программировании и разработке iOS. Мне нужно загрузить изображение, используя данные многочастной формы Alamofire, но мне также нужно ввести базовый заголовок аутентификации.

в этой теме Alamofire 4.0 Загрузить заголовок MultipartFormData , похоже на мою проблему, код для загрузки

Alamofire.upload(multipartFormData:{ multipartFormData in
         multipartFormData.append(unicornImageURL, withName: "unicorn")
         multipartFormData.append(rainbowImageURL, withName: "rainbow")},
       usingThreshold:UInt64.init(),
       to:"https://httpbin.org/post",
       method:.post, 
       headers:["Authorization": "auth_token"], 
       encodingCompletion: { encodingResult in
        switch encodingResult {
        case .success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint(response)
            }
        case .failure(let encodingError):
            print(encodingError)
        }
    })

но я запутался, как поставить заголовок базовой аутентификации (т.е. имя пользователя и пароль). и я также запутался, где я должен разместить свои данные изображения.

Я нашел другую ветку, которая кажется похожей на мою проблему. вот оно ... Как загрузить MultipartFormData с аутентификацией с использованием Alamofire , предлагаемое решение - этот код:

let username = "username"
let password = "password"

let credentialData = "\(username):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!                  
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": base64Credentials]

Alamofire.upload(
    .POST,
    "https://rilbits.com/supersafe/photo/upload",
    headers: headers,
    multipartFormData: { multipartFormData in
        let data = "default".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
        multipartFormData.appendBodyPart(data: data, name: "_formname")
        multipartFormData.appendBodyPart(fileURL: fileURL, name: "photo")
    },
    encodingCompletion: { encodingResult in
        switch encodingResult {

        case .Success(let upload, _, _):
            upload.responseString { response in
                debugPrint(response)
            }

        case .Failure(let encodingError):
            print(encodingError)
        }
    }
)

но после исправления на swift 4.1 выдает ошибку:

enter image description here

Не могли бы вы помочь моей проблеме? Заранее спасибо:)

Ответы [ 3 ]

0 голосов
/ 14 мая 2018
Use :

Alamofire.upload(multipartFormData:{ multipartFormData in
            multipartFormData.append(data, withName: "_formname") 
            multipartFormData.append(fileURL, withName: "photo")},
                         usingThreshold:UInt64.init(),
                         to:"URL",
                         method:.post,
                         headers:["Authorization": "auth_token"],
                         encodingCompletion: { encodingResult in
                            switch encodingResult {
                            case .success(let upload, _, _):
                                upload.responseJSON { response in
                                    debugPrint(response)
                                }
                            case .failure(let encodingError):
                                print(encodingError)
                            }
        })
0 голосов
/ 15 мая 2018

я наконец нашел ответ, пожалуйста, используйте мой код ниже

func uploadDefect(defectRemark: String, defectLocation: String, defectImage: UIImage, fileNameImage: String, completion: @escaping(_ errorMessage: String?) -> Void) {

    guard let imgData = defectImage.jpeg(.medium) else {return}

    let urlUpload = URLService.uploadDefect.endPoint

    let username = "admin"
    let password = "1234"
    let parameters : [String:Any] = ["defect_remark" : defectRemark, "defect_location": defectLocation, "tenant_id" : tenantID]



    var headers: HTTPHeaders = [:]

    if let authorizationHeader = Request.authorizationHeader(user: username, password: password) {
        headers[authorizationHeader.key] = authorizationHeader.value
    }

    Alamofire.upload(
        multipartFormData: { multipartFormData in

            for (key, value) in parameters {
                multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
            }

            multipartFormData.append(imgData, withName: "file", fileName: fileNameImage, mimeType: "image/jpeg")


    },
        to: urlUpload,
        headers: headers,
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    debugPrint(response)
                }
            case .failure(let encodingError):
                print(encodingError)
            }
    }
    )


}
0 голосов
/ 14 мая 2018

Я создал эту функцию: надеюсь, она у вас работает: -

 //Alamofire file upload code
func requestWith(URLString: String,
                 imageData: Data?,
                 fileName: String?,
                 pathExtension: String?,
                 parameters: [String : Any],
                 onView: UIView?,
                 vc: UIViewController,
                 completion:@escaping (Any?) -> Void,
                 failure: @escaping (Error?) -> Void) {

    let headers: HTTPHeaders = [
        "Content-type": "multipart/form-data"
    ]

    let URL = BASE_PATH + URLString
    Alamofire.upload(multipartFormData: { (multipartFormData) in
        for (key, value) in parameters {
            multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
        }

        if let data = imageData {
            multipartFormData.append(data, withName: "fileUpload", fileName: "\(fileName!).\(pathExtension!)", mimeType: "\(fileName!)/\(pathExtension!)")
        }

    }, usingThreshold: UInt64.init(), to: URL, method: .post, headers: headers) { (result) in

        switch result {
        case .success(let upload, _, _):
            upload.responseJSON { response in
                if let err = response.error {
                    failure(err)
                    return
                }
                completion(response.result.value)
            }
        case .failure(let error):
            print("Error in upload: \(error.localizedDescription)")
            failure(error)
        }
    }
}
...