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

