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

使用C# HttpClient上传文件至Node.js+Multer服务器失败求助

C# HttpClient 上传文件到 Node.js + Multer 服务器失败解决

我用 Node.js + Multer 搭建了文件接收服务器,Kotlin Retrofit 可以正常上传文件,但用 C# HttpClient 上传时,服务器端访问 req.file.filename 总是提示 file 为 undefined。


现有可正常工作的代码参考

Kotlin Retrofit 上传代码

val reqFile: RequestBody = file.asRequestBody("image/*".toMediaTypeOrNull())
val body = MultipartBody.Part.createFormData("upload", file.name, reqFile)
val name = "upload".toRequestBody("text/plain".toMediaTypeOrNull())
//val token = ...token

val message = messageToUpload
    .toRequestBody("text/plain; charset=utf-8".toMediaTypeOrNull())

val req: Call<ResponseBody?>? =
    apiService!!.postImage("Bearer $token", name, message, body)

Log.d("Tag", "uploading file...")

Node.js Multer 配置代码

router.post(
  "/upload",
  isValidUser,
  multer({
    storage: storage,
  }).single("upload"),
  async function (req, res) { //... 
   }

// Include the node file module
var fs = require("fs");

storage = multer.diskStorage({
  destination: "./uploads/",
  filename: async function (req, file, cb) {
    cb(null, file.originalname);
  },
});

原C#代码的问题

原代码存在几个关键错误:

  • 手动设置的 Content-Disposition 中 name 为 "file",但 Multer 配置的是接收名为 upload 的文件字段
  • 错误将文件内容的 ContentType 设置为 multipart/form-data,应该用文件对应的 MIME 类型(比如 image/jpeg)
  • 不必要地将 StreamContent 转换为 ByteArrayContent,增加了内存开销
  • 没有添加 Kotlin 代码中包含的 name、message 表单字段,以及请求头里的 Token

正确的C#实现代码

string fullFilePath = @"C:\image.jpg";
var fileName = Path.GetFileName(fullFilePath);
var token = "你的Token值";
var messageToUpload = "要上传的消息内容";

using var requestContent = new MultipartFormDataContent();

// 添加文件部分
using (var fs = File.OpenRead(fullFilePath))
{
    var streamContent = new StreamContent(fs);
    // 设置正确的文件MIME类型,这里以jpg为例,可根据实际文件调整
    streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
    // 这里的"upload"要和Multer配置的single("upload")一致
    requestContent.Add(streamContent, "upload", fileName);
}

// 添加name表单字段(和Kotlin代码对应)
var nameContent = new StringContent("upload", Encoding.UTF8, "text/plain");
requestContent.Add(nameContent, "name");

// 添加message表单字段(和Kotlin代码对应)
var messageContent = new StringContent(messageToUpload, Encoding.UTF8, "text/plain; charset=utf-8");
requestContent.Add(messageContent, "message");

// 创建HttpClient并设置Authorization头
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

// 发送请求
var response = await client.PostAsync("http://localhost:3000/api/upload", requestContent);
response.EnsureSuccessStatusCode(); // 可根据需要处理错误状态码
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);

关键注意点

  • 确保文件字段的名称 upload 和 Multer 的 .single("upload") 完全一致
  • 表单字段 name、message 要和 Kotlin 代码中传递的参数对应
  • 正确设置请求头的 Authorization Token
  • 文件的 ContentType 要匹配实际文件类型,避免用错误的 multipart/form-data

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:24:21