Swift中如何将Blob存储数据追加到multipart/form-data中
Swift 实现带JSON Blob和音频文件的multipart/form-data请求
你需要的和JS端逻辑完全等效的Swift实现如下,优先提供原生URLSession兼容的实现方案,无需引入第三方依赖:
import Foundation func createMultipartBody(audioFile: Data, audioFileName: String, jsonParams: [String: Any]) -> (body: Data, contentType: String) { // 生成随机边界,multipart格式要求的分隔符 let boundary = "Boundary-\(UUID().uuidString)" var body = Data() // 1. 对应JS代码中的data字段:JSON Blob,Content-Type设置为application/json body.append("--\(boundary)\r\n".data(using: .utf8)!) body.append("Content-Disposition: form-data; name=\"data\"\r\n".data(using: .utf8)!) body.append("Content-Type: application/json\r\n\r\n".data(using: .utf8)!) // 序列化JSON let jsonData = try! JSONSerialization.data(withJSONObject: jsonParams) body.append(jsonData) body.append("\r\n".data(using: .utf8)!) // 2. 对应JS代码中的media字段:音频文件 body.append("--\(boundary)\r\n".data(using: .utf8)!) body.append("Content-Disposition: form-data; name=\"media\"; filename=\"\(audioFileName)\"\r\n".data(using: .utf8)!) // 这里根据你的音频格式调整MIME类型,示例为mp3格式 body.append("Content-Type: audio/mpeg\r\n\r\n".data(using: .utf8)!) body.append(audioFile) body.append("\r\n".data(using: .utf8)!) // 拼接结束边界 body.append("--\(boundary)--\r\n".data(using: .utf8)!) // 返回请求体和需要设置的Content-Type头 return (body, "multipart/form-data; boundary=\(boundary)") }
使用示例
// 构造参数 let audioData: Data = // 你的音频文件数据 let jsonParams = ["key": "value", "key1": "value1"] let (requestBody, contentType) = createMultipartBody( audioFile: audioData, audioFileName: "recording.mp3", jsonParams: jsonParams ) // 构造请求 var request = URLRequest(url: URL(string: "你的接口地址")!) request.httpMethod = "POST" request.setValue(contentType, forHTTPHeaderField: "Content-Type") request.httpBody = requestBody // 后续用URLSession发起请求即可
如果你的项目已经引入Alamofire网络库,实现会更简洁:
import Alamofire let parameters = ["key": "value", "key1": "value1"] let audioData: Data = // 音频文件数据 AF.upload( multipartFormData: { formData in // 添加上JSON data字段 if let jsonData = try? JSONSerialization.data(withJSONObject: parameters) { formData.append(jsonData, withName: "data", mimeType: "application/json") } // 添加音频media字段 formData.append(audioData, withName: "media", fileName: "recording.mp3", mimeType: "audio/mpeg") }, to: "你的接口地址" ).response { response in // 处理响应 }
内容的提问来源于stack exchange,提问作者Abdul Abdurahim
相关产品推荐
相关产品推荐

