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

Swift上传PNG文件被异常编码致FastAPI后端报错求助

解决Swift上传PNG到FastAPI时文件编码异常的问题

问题核心

你手动拼接multipart/form-data格式数据上传,本地打印的十六进制数据符合PNG标准,但服务器端收到的文件开头出现UTF-8替换字符ef bf bd,导致FastAPI判定图片类型不支持。

根本原因

手动拼接二进制数据与多部分表单边界时,易出现隐形格式错误(尽管本地打印看似正常);同时URLSession.uploadTask(with:from:)处理手动构建的multipart数据时,可能触发意外的编码转换,破坏原始PNG数据。

解决方案:用系统API规范构建Multipart表单

放弃手动拼接,改用MultipartFormData类(iOS 13+可用)构建表单数据,它会自动处理边界、头信息和二进制编码,彻底避免手动拼接的潜在问题:

// photo is a UIImage variable
guard let pngData = photo.pngData() else {
    // 处理PNG转换失败的情况
    return
}

let boundary = UUID().uuidString
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "PUT"
urlRequest.addValue(tokens.idToken, forHTTPHeaderField: "Authorization")

// 构建Multipart表单部件
let formPart = MultipartFormData.Part(
    formData: pngData,
    name: "file",
    fileName: "user_icon.png",
    mimeType: "image/png"
)
let formData = MultipartFormData(parts: [formPart], boundary: boundary)

// 设置正确的Content-Type头
urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
// 移除错误的Accept头,或设置为服务器实际返回的格式(如application/json)
// urlRequest.setValue("application/json", forHTTPHeaderField: "Accept")

// 执行上传请求
session.uploadTask(with: urlRequest, from: formData.bodyData) { responseData, response, error in
    guard let responseData = responseData, error == nil else {
        print(error?.localizedDescription ?? "Unknown error")
        return
    }
    if let json = try? JSONSerialization.jsonObject(with: responseData) as? [String: Any] {
        print(json)
    }
}.resume()

额外注意事项

  • 修正Accept头:你之前设置Accept为multipart/form-data,但接口响应是JSON格式,这会干扰服务器返回逻辑,建议改为application/json或直接移除。
  • 避免强制解包:代码中pngData()!存在崩溃风险,改用guard let安全处理转换失败场景。
  • 验证后端接收逻辑:若问题仍存在,可让后端同事确认FastAPI的文件接收代码是否正确,示例正确代码如下:
    from fastapi import FastAPI, File, UploadFile
    
    app = FastAPI()
    
    @app.put("/avatar")
    async def update_avatar(file: UploadFile = File(...)):
        # 处理文件存储等逻辑
        return {"status": "success"}
    

内容的提问来源于stack exchange,提问作者Nero Tyagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:25:38