上传文件的两种常见传输格式
上传文件的两种常见传输格式

上传文件的两种常见传输格式

在现代的 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 方式仍是最佳选择。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注