Alamofire多图片上传带参数

  • 开发语言:
    前端:swift
    后端:Java

1.Alamofire版本

pod 'Alamofire', '~> 4.5'

2.swift主要方法

typealias StringVoidBlock = (String?)->(Void)
typealias JSONVoidBlock = (JSON)->(Void)

/// 多图上传,带参数(必须用formdata表单上传)
    /// - Parameters:
    ///   - apiName: 接口方法名
    ///   - method: HTTP请求的方法名(POST、PUT等)
    ///   - params: 需要传递的参数
    ///   - images: 上传的图片数组
    ///   - success: 成功回调
    ///   - fail: 失败回调
    static func upload(apiName:String,method:HTTPMethod,params:[String:Any]?,images:[UIImage],success: JSONVoidBlock?,fail:StringVoidBlock?) {
        
        let fullStr = SERVERURL + apiName
        /// 设置公共参数
        let token = "token" /// 这是你们httpHeader用到的token
        
        let httpHeader: HTTPHeaders = [
            "Authorization": token,
            "Content-type": "multipart/form-data"
        ]
        
        Alamofire.upload(multipartFormData: { (multipartFormData) in
            
            if params != nil {
                for (key, value) in params! {
                    let data_ = "\(value)".data(using: String.Encoding.utf8)!
                    HLog(message: data_)
                    multipartFormData.append(data_, withName: key)
                }
            }

            for index in 0..<images.count {
                let img = images[index]
                if let imgData = img.jpegData(compressionQuality: 0.2) {
                    multipartFormData.append(imgData, withName: "files",fileName: "image_\(index).png", mimeType: "image/png")
                }
            }
            
        }, to: fullStr ,method: method,headers: httpHeader) { (encodingResult) in
            // SessionManager.MultipartFormDataEncodingResult
            print("UPLOAD请求url----->" + fullStr)
            print("UPLOAD请求params-----> \(params ?? [:])")
            
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    /// 上传成功
                    guard response.result.isSuccess else {
                        /// 网络链接错误或者服务器故障
                        if fail != nil {
                            fail!("网络链接错误或者服务器故障")
                        }
                        return
                    }
                    
                    let json = JSON(response.result.value as Any)
                    let msg = json["message"].stringValue
                    let code = json["code"].intValue
                    if code == 200 {
                        /// 成功
                        if success != nil {
                            success!(json["data"])
                        }
                        
                        print(json["data"])
                        
                    }else if code == 401 {
                        /// token 失效,重新登录
                        if fail != nil {
                            fail!("登录失败,请重新登录")
                            ELUser.share.userModel = nil
                            toLogin()
                        }
                    }else {
                        /// 失败
                        if fail != nil {
                            fail!(msg)
                        }
                    }
                }
                
            case .failure(let encodingError):
                if fail != nil {
                    fail!(encodingError.localizedDescription)
                }
            }
        }
    }

3.如何使用

/// 提交修改(上传图片)
    private func requestTest() {
        /// 1.拼接URL
        let urlStr = "https://www.baidu.com"
        /// 参数
        let jsonStr = NSObject.getJSONStringFromDictionary(dictionary: [
            "key_A" :"AAAA",
            "key_B" : "BBBB",
        ])
        let params = [
            "testParams" : jsonStr,
            "otherParams" : NSObject.getJSONStringFromArray(arr: ["A","B","C"])
        ] as [String : Any]
        
        let uploadImages = images[0..<images.count]
        weak var weakSelf = self
        ELHttpTool.upload(apiName: urlStr,method: .put,params: params, images: uploadImages , success: { (result) -> (Void) in
            print("上传成功!")
            }
        }) { (errStr) -> (Void) in
            if errStr != nil {
                MBProgressHUD.showMsg(toView: KeyWin, msg: errStr!)
            }
        }
        
    }

  • 注意点:
    如果后端接不到数据,那么你要和后端确认,他那边是否是JSON反序列化的。如果是,应该没问题,如果不是,要看他是怎么接收的数据。Alamofire框架已经很强大了,基本没啥问题,抽空多看看他的源码就知道了。一般出了问题,主要还是和后端的兄弟姐妹们积极沟通,断点调试最好。

最后

上面用到的JSON序列化方法如下:


import Foundation

extension NSObject {
    // 字符串过滤 fillter
    class func fillterList(lastList:[String],searchStr:String) -> [String] {
        let arr:[String]?
        arr = lastList.filter({ (restaurant) -> Bool in
            return restaurant.localizedCaseInsensitiveContains(searchStr)
        })
        
        return arr!
    }
    
    /**
     *  字典转换为JSONString
     */
    class func getJSONStringFromDictionary(dictionary:NSDictionary) -> String {
        if (!JSONSerialization.isValidJSONObject(dictionary)) {
            print("无法解析出JSONString")
            return ""
        }
        let data : NSData! = try? JSONSerialization.data(withJSONObject: dictionary, options: []) as NSData?
        let JSONString = NSString(data:data as Data,encoding: String.Encoding.utf8.rawValue)
        return JSONString! as String
    }
    
    /**
     *  数组转换为JSONString
     */
    class func getJSONStringFromArray(arr:Array<Any>) -> String {
        if (!JSONSerialization.isValidJSONObject(arr)) {
            print("无法解析出JSONString")
            return ""
        }
        
        let data : NSData! = try? JSONSerialization.data(withJSONObject: arr, options: []) as NSData?
        let JSONString = NSString(data:data as Data,encoding: String.Encoding.utf8.rawValue)
        return JSONString! as String
    }
    
    /**
     *  JSONString转换为字典
     */
    class func getDictionaryFromJSONString(jsonString:String) ->NSDictionary{
        
        let jsonData:Data = jsonString.data(using: .utf8)!
        
        let dict = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
        if dict != nil {
            return dict as! NSDictionary
        }
        return NSDictionary()
    }
    
    
    /**
     *  JSONString转换为数组
     */
    func getArrayFromJSONString(jsonString:String) ->NSArray{
        
        let jsonData:Data = jsonString.data(using: .utf8)!
        
        let array = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
        if array != nil {
            return array as! NSArray
        }
        return array as! NSArray
        
    }
    
    
    /// 在一定的数组中取出一个随机值()
    ///
    /// - Returns: 随机值
    class func randomValueFromIntUppercasedArr() -> String {
        
        let arr = ["0","1","2","3","4","5","6","7","8","9","Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","M"]
        
        let index:Int = Int(arc4random()%UInt32((arr.count - 1)))
        let str = arr[index]
        
        return str
    }

}

/// 自定义Log
func HLog<T>(message : T?,file: String = #file,methodName: String = #function, lineNumber: Int = #line){
    #if DEBUG
    let fileName = NSString.init(string: (file as String)).lastPathComponent
    let line = String.init(format: "第%d行", lineNumber)
    let name = "======>"
    let date = NSDate()
    let timeFormatter = DateFormatter()
    timeFormatter.dateFormat = "yyy-MM-dd 'at' HH:mm:ss.SSS"
    let strNowTime = timeFormatter.string(from: date as Date) as String
    print("[\(strNowTime)][\(fileName)\(line)]\(methodName)\(name)\(String(describing: message))")
    #endif
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容