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