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

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"]获取
  • Content-Type适配:根据你上传的文件类型调整Content-Type,比如上传图片时改成image/jpeg,这样后端能更准确识别文件类型
  • 文件权限:确保你的Swift代码有读取目标文件的权限(比如沙盒内的文件需要正确获取访问权限)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:08:24