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

