由于不想在项目中用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() }