Swift向Web API上传文件无数据问题排查求助
解决Swift上传文件到C# Web API时无文件数据的问题
我帮你搞定这个问题!你现在遇到的核心问题是没有按照multipart/form-data格式构建上传请求——直接把文件原始内容塞到请求体里的话,后端C# API没办法把它识别为Request.Files里的文件项,自然就会出现Count = 0的情况。
问题根源
你的原代码应该是直接将文件数据作为请求体发送,但Web API接收上传文件时,期望的是符合multipart/form-data规范的请求(也就是带表单字段的分段数据),只有这种格式的请求才会被解析到HttpContext.Current.Request.Files集合中。
正确的Swift上传实现代码
下面是完整的修正版代码,我会标注关键步骤:
func upload(_ fileURL: URL) { // 替换成你的实际上传API地址 guard let requestUrl = URL(string: "你的上传API地址") else { print("无效的上传URL,请检查地址格式") return } // 1. 初始化POST请求 var request = URLRequest(url: requestUrl) request.httpMethod = "POST" // 2. 生成multipart请求的边界符(用于分隔不同表单项,必须唯一) let boundary = "UploadBoundary-\(UUID().uuidString)" request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") // 3. 读取目标文件数据 guard let fileData = try? Data(contentsOf: fileURL) else { print("无法读取文件,请检查文件路径和权限") return } let fileName = fileURL.lastPathComponent // 获取文件名(包含后缀) // 4. 构建multipart请求体 var requestBody = Data() // 添加文件表单项的头部信息 requestBody.append("--\(boundary)\r\n".data(using: .utf8)!) // 这里的`name="file"`要和后端接收的参数名对应 requestBody.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!) // 根据文件类型调整Content-Type,比如图片用image/jpeg,PDF用application/pdf,通用类型用application/octet-stream requestBody.append("Content-Type: application/octet-stream\r\n\r\n".data(using: .utf8)!) // 添加实际的文件数据 requestBody.append(fileData) // 添加请求体结束标记 requestBody.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!) // 绑定请求体到请求对象 request.httpBody = requestBody // 5. 发送上传请求 let uploadTask = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("上传失败:\(error.localizedDescription)") return } // 处理后端响应 if let httpResponse = response as? HTTPURLResponse { print("上传状态码:\(httpResponse.statusCode)") if let responseData = data, let responseString = String(data: responseData, encoding: .utf8) { print("后端响应内容:\(responseString)") } } } uploadTask.resume() }
关键注意事项
- 后端参数对应:如果Swift代码里
name="file",那么C#控制器的接收参数要匹配:- 旧版ASP.NET:可以通过
HttpContext.Current.Request.Files["file"]获取 - ASP.NET Core:可以在Action中声明
IFormFile file参数,或者从Request.Form.Files["file"]获取
- 旧版ASP.NET:可以通过
- Content-Type适配:根据你上传的文件类型调整
Content-Type,比如上传图片时改成image/jpeg,这样后端能更准确识别文件类型 - 文件权限:确保你的Swift代码有读取目标文件的权限(比如沙盒内的文件需要正确获取访问权限)
内容的提问来源于stack exchange,提问作者Conner
相关产品推荐
相关产品推荐

