Swift 上传到腾讯云OSS

由于不想在项目中用IOS SDK的形式,因为臃肿以及项目是跟uniapp相结合的,所以打算用原生的形式来上传

至于在上传之前所需要的哪些签名、加密之类的,由uniapp处理之后在给app即可。


OSS上传POST OBject 这里边有个很重要的点,就是file字段必须要放在最后。

另外的注意点,比如严格按照这样的形式添加,切记切记

data.append("--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!)
data.append("\(value)\r\n".data(using: .utf8)!)



@objc public func uploadFile(json: [String : Any], cb: @escaping WXCallBack){
        // json就是uniapp最终给app的,原封不动的拿过来就行了
        var filePath = json["filePath"] as! String
        let ss = filePath.split(separator: "Library")
        filePath = NSHomeDirectory() + "/Library" + ss[1]

        let fileURL = URL.init(fileURLWithPath: filePath)
        let uploadUrl = json["url"] as! String
        let uploadURL = URL(string: uploadUrl)!
        var parameters = json["formData"] as! Json
        
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        var request = URLRequest(url: uploadURL)
        request.httpMethod = "POST"
        let boundary = UUID().uuidString
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
        request.setValue("binary", forHTTPHeaderField: "Content-Transfer-Encoding")
        request.addValue("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", forHTTPHeaderField: "User-Agent")
        var data = Data()

        // 添加其他参数到数据体
        for (key, value) in parameters {
            
            
            data.append("--\(boundary)\r\n".data(using: .utf8)!)
            data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!)
            data.append("\(value)\r\n".data(using: .utf8)!)
            
            
            
        }
        
        
        
        data.append("--\(boundary)\r\n".data(using: .utf8)!)
        let file = json["name"] as? String ?? "file"
        data.append("Content-Disposition: form-data; name=\"\(file)\"; filename=\"\(fileURL.lastPathComponent)\"\r\n".data(using: .utf8)!)
        data.append("Content-Type: audio/aac\r\n".data(using: .utf8)!)
        
        do {
            let fileData = try Data(contentsOf: fileURL)
            data.append("Content-Length: \(fileData.count)\r\n\r\n".data(using: .utf8)!)
            data.append(fileData)
            // 我就是少了这一行,导致一直400
            data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)

        } catch {
            cb(["type":"fail","code":404, "msg":error.localizedDescription],false)
            return
        }
        request.httpBody = data
        let task = session.dataTask(with: request) { data, response, error in
            // 处理响应
            if let err = error {
                print("Error: \(err.localizedDescription)")
                cb(["type":"fail","msg":err.localizedDescription],false)
                return
            }
            let rr = response as! HTTPURLResponse
            let msg = String.init(data: data!, encoding: .utf8)!
            print("HTTPURLResponse\(msg)")
            
            let type = (rr.statusCode >= 200 && rr.statusCode <= 204) ? "success":"fail"
            cb(["type":type,"data":msg,"statusCode":rr.statusCode],false)

        }
        task.resume()
    }


Powered By Z-BlogPHP 1.7.4

Copyright 粤ICP备2024347557号 Rights Reserved.