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

为Multipart Upload添加自定义参数 解决iOS图片上传返回400错误问题

iOS Multipart图片上传400错误修复方案

你代码里存在几个明显问题,逐一修复即可解决:

问题清单

  • 缺失Data实例初始化:你的代码直接调用data.append拼接请求体,但没有提前声明var data = Data(),会导致请求体为空,服务端无法解析直接返回400
  • 文件参数名不匹配:你需要确保调用方法时paramName传入值为files,和Postman配置的文件参数名一致
  • filename字段配置错误:你当前直接把fileType作为文件名参数值,正确值应该是带后缀的合法文件名(比如upload_img.png),不能仅传文件类型字符串
  • Content-Type固定写死不合理:如果上传的是JPG等其他格式图片,固定写image/png会和实际文件格式不匹配,建议根据你上传的图片类型动态调整

修正后的完整代码

/*****Multipart Upload*********/
func uploadImage(paramName: String, fileName: String, image: UIImage, id: String, comepletion:@escaping ()->Void, failure:@escaping (String)->Void) {
    guard let url = URL(string: "https:someURL") else {
        failure("无效的请求地址")
        return
    }
    let boundary = UUID().uuidString
    let session = URLSession.shared
    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = "POST"
    // 设置请求头
    urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    urlRequest.setValue(id, forHTTPHeaderField: "some_id")
    // 初始化请求体Data
    var data = Data()
    // 拼接边界符
    data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
    // 配置Content-Disposition,paramName传files即可匹配Postman配置
    data.append("Content-Disposition: form-data; name=\"\(paramName)\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!)
    // 这里如果上传的是JPG就改成image/jpeg,和实际文件格式匹配
    data.append("Content-Type: image/png\r\n\r\n".data(using: .utf8)!)
    // 添加图片数据
    guard let imageData = image.pngData() else {
        failure("图片数据生成失败")
        return
    }
    data.append(imageData)
    // 拼接结束边界符
    data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
    // 发起请求
    session.uploadTask(with: urlRequest, from: data, completionHandler: { responseData, response, error in
        if let error = error {
            failure(error.localizedDescription)
            return
        }
        guard let responseData = responseData else {
            failure("无响应数据")
            return
        }
        do {
            if let json = try JSONSerialization.jsonObject(with: responseData, options: .allowFragments) as? [String: Any] {
                print(json)
                comepletion()
            }
        } catch {
            failure("响应解析失败:\(error.localizedDescription)")
        }
    }).resume()
}

调用示例

//  paramName传"files"匹配Postman配置,fileName传带后缀的文件名
uploadImage(paramName: "files", fileName: "test_upload.png", image: yourImage, id: yourId) {
    // 上传成功逻辑
} failure: { errorMsg in
    print("上传失败:\(errorMsg)")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:24:03