在现代的 REST API 中,上传文件的数据通常有两种常见的传输格式:multipart/form-data 和 JSON。各有不同的应用场景:
1、multipart/form-data
这种格式仍然常用于上传文件,因为它支持二进制数据的传输,特别是图片、视频或文档文件。
上传包含多种内容的表单时(如图片和文本),multipart/form-data 结构较清晰且兼容性较高(尤其是 HTML 表单上传)。
服务器端大多可以解析 multipart/form-data 格式,它会按边界(boundary)分割字段内容,因此代码上传后一般能被正确识别。
2、JSON
JSON 格式适合传输纯文本数据,如用户信息或一般请求参数,甚至适合上传 base64 编码的文件。
在不需要上传二进制文件时,JSON 格式更简洁,结构更清晰,在现代 API 中很流行。
但 JSON 格式在处理文件上传时,可能需要额外的步骤将文件内容编码为 base64 格式(大文件时会增大体积),导致效率降低。
multipart/form-data是否需要转换为 JSON 格式
对于 上传图片和文本内容的表单,multipart/form-data 仍是合适且常用的选择。JSON 上传仅在服务器不支持 multipart/form-data,或 API 明确要求 JSON 格式时才推荐。
如何将表单内容转成 JSON
如果 API 要求 JSON 格式,可以将图片转换为 base64 字符串后用 JSON 结构发送。以下是改写的示例:
import Foundation
import UIKit
func uploadImageAndTextAsJSON(url: URL, image: UIImage, parameters: [String: String]) {
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// 将图片转换为 base64
let imageData = image.jpegData(compressionQuality: 1.0)!
let base64ImageString = imageData.base64EncodedString()
// 合并文本参数和图片数据
var jsonParameters = parameters
jsonParameters["image"] = base64ImageString
// 将参数转换为 JSON 数据
request.httpBody = try? JSONSerialization.data(withJSONObject: jsonParameters, options: [])
// 创建上传任务
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("上传失败:\(error)")
return
}
if let response = response as? HTTPURLResponse, response.statusCode == 200 {
print("上传成功")
} else {
print("服务器返回错误")
}
}
task.resume()
}
// 调用方式
let url = URL(string: "https://example.com/upload")!
let image = UIImage(named: "exampleImage")!
let parameters = ["username": "user123", "description": "This is a JSON upload"]
uploadImageAndTextAsJSON(url: url, image: image, parameters: parameters)
注意:由于 base64 增加了数据体积,这种方式适合小文件。如果文件较大,multipart/form-data 方式仍是最佳选择。