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
相关产品推荐
相关产品推荐

