【问题标题】:How to upload an image using alamofire multipart form data with basic authentication?如何使用具有基本身份验证的 alamofire 多部分表单数据上传图像?
【发布时间】:2018-10-23 22:07:04
【问题描述】:

我是编程和 iOS 开发的新手。我需要使用 Alamofire 多部分表单数据上传图像,但我还需要输入基本身份验证标头。

在这个线程Alamofire 4.0 Upload MultipartFormData Header,好像和我的问题差不多,代码是这样上传的

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)
        }
    })

但我很困惑如何放置基本身份验证(即用户名和密码)标头。我也很困惑我应该把图像数据放在哪里。

我找到了另一个与我的问题相似的线程。这是...How to upload MultipartFormData with authentication using 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 之后它给出了一个错误:

你能帮我解决问题吗?在此先感谢:)

【问题讨论】:

    标签: ios swift file-upload alamofire multipartform-data


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

    【讨论】:

    • 感谢 deepak,但据说“MultipartFormData”类型的值没有成员“appendBodyPart”
    • 使用:multipartFormData.append(data, withName: "_formname") 和 multipartFormData.append(fileURL, withName: "photo")
    【解决方案2】:

    我终于找到答案了,请使用我下面的代码

    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)
                }
        }
        )
    
    
    }
    

    【讨论】:

      【解决方案3】:

      我已经创建了这个函数:希望它对你有用:-

       //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)
              }
          }
      }
      

      【讨论】:

      • 感谢 Manish,但如何在您的代码中插入基本身份验证管理员和密码?
      • 把它放在标题中,事实是你不应该使用密码。向 API 人员询问身份验证令牌
      • 是的,最好使用令牌,但我现在必须使用基本身份验证。我尝试将标题更改为类似于此图像 i.stack.imgur.com/o6xSl.png ,但出现错误 CredStore - performQuery - Error copying matching creds。错误=-25300。先生有什么建议吗?
      • 你看到这个链接了吗stackoverflow.com/questions/46099940/…
      • 是的,我已经尝试过了,但我无法将它实现到 alamofire 代码/您上面的代码
      猜你喜欢
      • 2018-10-24
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 2023-03-23
      • 2015-02-06
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多