You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:15:03