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

在.NET 8 C#中如何无文件名读取上传的Inline类型File?

问题

上传不带文件名的图片时,.NET 8 API端接收的formFile始终为null,但给StreamContent指定文件名后就能正常工作,需要实现无需提供文件名的文件上传功能。

客户端请求代码

var content = new MultipartFormDataContent
{
    { new StreamContent(file), "file" },
    { new StringContent(JsonConvert.SerializeObject(metadata), Encoding.UTF8, "application/json"), "metadata" }
};

API端接收代码

var form = await Request.ReadFormAsync();
var formFile = form.Files["file"];

// formFile 返回 NULL

原因分析

.NET的IFormFile解析逻辑依赖multipart表单中文件项的Content-Disposition头必须包含filename参数。默认情况下,创建StreamContent并添加到MultipartFormDataContent时,如果不指定文件名,不会生成带filename的Content-Disposition头,API会把它识别成普通表单数据,而非文件项,所以form.Files里找不到对应的内容。

解决方案

方案1:手动设置Content-Disposition头(推荐)

在客户端给StreamContent手动添加Content-Disposition头,明确标记为文件项,即使文件名设为空字符串也可以:

var streamContent = new StreamContent(file);
// 手动构造Content-Disposition头,指定name和空文件名
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
    Name = "\"file\"", // 注意要加双引号,符合multipart格式要求
    FileName = "\"\""  // 空文件名
};

var content = new MultipartFormDataContent
{
    streamContent,
    { new StringContent(JsonConvert.SerializeObject(metadata), Encoding.UTF8, "application/json"), "metadata" }
};

这样API端就能正常解析出formFile,因为Content-Disposition头符合文件上传的格式规范。

方案2:API端直接读取普通表单数据(仅适用于文本文件)

如果不想修改客户端代码,API端可以直接读取form中的普通表单项,再转换为流处理。但注意这种方式只适合文本类文件,二进制图片用这种方法会损坏:

var form = await Request.ReadFormAsync();
var fileContent = form["file"];

if (!string.IsNullOrEmpty(fileContent))
{
    using var stream = new MemoryStream(Encoding.UTF8.GetBytes(fileContent));
    // 这里处理stream,比如保存文件等操作
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:40:56