繁体   English   中英

通过Swift 3和Alamofire 4上传带有JSON和自定义标题的照片/文件 iOS | 迅速

[英]Upload Photo / File with JSON and custom headers via Swift 3 and Alamofire 4 | iOS | Swift

我需要使用Image文件和JSON调用Multipart请求。

我试过这个,但仍然得到错误。

 // define parameters
  let parameters = [
    "hometown": "yalikavak",
    "living": "istanbul"
  ]

Alamofire.upload(multipartFormData: { multipartFormData in
    if let imageData = UIImageJPEGRepresentation(image, 1) {
      multipartFormData.append(imageData, withName: "file", fileName: "file.png", mimeType: "image/png")
    }

    for (key, value) in parameters {
      multipartFormData.append((value?.data(using: .utf8))!, withName: key)
    }}, to: "upload_url", method: .post, headers: ["Authorization": "auth_token"],
        encodingCompletion: { encodingResult in
          switch encodingResult {
          case .success(let upload, _, _):
            upload.response { [weak self] response in
              guard let strongSelf = self else {
                return
              }
              debugPrint(response)
            }
          case .failure(let encodingError):
            print("error:\(encodingError)")
          }
  })
}

如何发送JSON?

在单个请求中尝试使用此代码进行多个上传图像,此代码已经可用。

     // For Pass Valid Parameters & number of Images in Array in Image Upload Function
     var dicImgData : NSMutableDictionary? = NSMutableDictionary()

     if let img = UIImage(named: "Your Image") {
         if let data:Data = UIImagePNGRepresentation(img) {
             var imageData : NSData = data
             dicImgData! .setObject(imageData, forKey: "data" as NSCopying)
             dicImgData! .setObject("file", forKey: "name" as NSCopying)
             dicImgData! .setObject("file.png", forKey: "fileName" as NSCopying)
             dicImgData! .setObject("image/png", forKey: "type" as NSCopying)

             let dicParameter = [
                 "hometown": "yalikavak",
                 "living": "istanbul"
             ]

             self.uploadImage(url: "Your URL", Parameter: dicParameter, Images: [dicImgData])
         }
    }

上传功能

    func uploadImage (url: String, Parameter param : NSDictionary, Images arrImage: NSArray) -> Void
    {
        var requestURL : String! = url
        let headers = [
            "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
            "Accept": "application/json",
            ]

        print("---------------------")
        print("Request URL :- \(requestURL)")
        print("---------------------")

        Alamofire.upload(multipartFormData: { (data) in

            for (key, value) in param {
                data.append((value as! String).data(using: .utf8)!, withName: key as! String)
            }

            for imageInfo in arrImage
            {
                var dicInfo : NSDictionary! = imageInfo as! NSDictionary
                data.append(dicInfo["data"] as! Data, withName: dicInfo["name"] as! String, fileName: dicInfo["fileName"] as! String, mimeType: dicInfo["type"] as! String)
                dicInfo = nil
            }

        }, to: requestURL, method: .post , headers:nil, encodingCompletion: { (encodeResult) in
            switch encodeResult {
            case .success(let upload, _, _):

                upload.responseJSON(completionHandler: { (response) in

                    switch response.result
                    {
                    case .success(let responseJSON):
                        guard let dicResponse = responseJSON as? NSDictionary else{
                            return
                        }

                        print("Response : \((dicResponse))")

                    case .failure(let error):

                        print(error)

                        break
                    }
                })
            case .failure(let error):
                print(error)
                break
            }
        })
    }

根据您提供的数据,我得出如下结论。

状态代码400表示你传递给api的json没有关注api文档。 例如,如果他们期望一个关键的“名字”而你根本没有得到这样的钥匙。

此错误的其他可能原因。

好像你没有提到任何内容类型

添加这些代码行以确保响应和请求的格式正确

Alamofire.request(.GET, "your url", parameters: ["foo": "bar"])
         .validate(statusCode: 200..<300)
         .validate(contentType: ["application/json"])
         .response { (_, _, _, error) in
                  println(error)
         }

Accept标头告诉服务器客户在响应中想要什么。 Content-Type标头告诉服务器客户端在请求中发送的内容。

如果您能提供更多信息,我们可以提供更多帮助。

在这里,我制作了自定义Web服务,您可以使用它。 此Web服务适用于带有图像和视频的上载字典,或两者都有或没有它。

import Foundation
import Alamofire
class WebServiceHandler: AnyObject {

    func uploadWithAlamofire(Parameters params : [NSObject : AnyObject]?,ImageParameters imgparams :  [NSObject : AnyObject]?,VideoParameters vidoparam :  [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void)
    {
        var base_url = "http://benzatineinfotech.com/webservice/finder/index.php/Web_api/"
        base_url.append(action as String)

        Alamofire.upload(multipartFormData: { multipartFormData in
            if imgparams != nil{
                for (key, value) in imgparams! {
                    if let imageData = UIImageJPEGRepresentation(value as! UIImage, 1) {
                        multipartFormData.append(imageData, withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000)).jpg", mimeType: "image/jpg")
                    }
                }
            }
            if vidoparam != nil{
                for (key, value) in vidoparam! {
                    multipartFormData.append(value as! URL , withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000).mp4", mimeType: "application/octet-stream")
                }
            }
            if params != nil
            {
                for (key, value) in params! {
                    multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String)
                }

            } }, to: base_url, method: .post, headers: nil,
                 encodingCompletion: { encodingResult in
                    switch encodingResult {
                    case .success(let upload, _, _):
                        upload.uploadProgress { progress in
                            print(progress.fractionCompleted)
                        }
                        upload.response { [weak self] response in
                            guard self != nil else {
                                return
                            }
                            let responseString = String(data: response.data!, encoding: String.Encoding.utf8)
                            return success(responseString as AnyObject)

                        }
                    case .failure(let encodingError):
                        print("error:\(encodingError)")
                        return failure(encodingError as AnyObject)
                    }
        })
    }
    func convertToDictionary(text: String) -> [String: Any]? {
        if let data = text.data(using: .utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            } catch {
                print(error.localizedDescription)
            }
        }
        return nil
    }
}

用法:

self.webservice.uploadWithAlamofire(Parameters: dict_params as [NSObject : AnyObject], ImageParameters: imgparam as [NSObject : AnyObject], VideoParameters:  videoparam as [NSObject : AnyObject], Action: "write_message", success: { (success) in
        print(success)
}) { (error) in
        print(error)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM