ASP采用multipart/form-data方式上传数据,数据的结构是啥样的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP采用multipart/form-data方式上传数据,数据的结构是啥样的?相关的知识,希望对你有一定的参考价值。

asp无组件上传代码研究了很久,还是感觉有些不懂。总感觉没研究出ASP二进制上传数据结构怎么封装和排位置的?
请高手指点一下,还望写清数据结构的逻辑。小生初学。。!
请别代码一大堆来。。。上传代码我已经看了N遍了。写清他结构就行了。我知道是2进制想知道传输中的数据结构?

例如
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
<input name="aa" type="text" id="aa" />
<input type="file" name="file1" />

<input type="submit" name="Submit" value="提交" />
</form>
首先输入值aa=ssssss,file1选择文件F:\Documents and Settings\Administrator\桌面\smtp.txt 这个文件的内容是三个汉字“你好啊”
提交后
得到
=========================下面是得到的二进制形式的数据
-----------------------------7d7f31001bc
Content-Disposition: form-data; name="aa"

ssssss
-----------------------------7d7f31001bc
Content-Disposition: form-data; name="file"; filename="F:\Documents and Settings\Administrator\桌面\smtp.txt"
Content-Type: text/plain

你好啊
-----------------------------7d7f31001bc
Content-Disposition: form-data; name="Submit"

提交
-----------------------------7d7f31001bc--
=========================二进制数据完
可以看出数据结构:
多个以-----------------------------7d7f31001bc分隔开的二进制数段组成的数据流,其中每一段都包含一个提交的表单元素的名称和值,是文件的话还包含有文件名和Content-Type类型。
但是并不是每次提交都是-----------------------------7d7f31001bc这个字符串,其实这个字符串是在上传时定义的,并且写从request.ServerVariables("HTTP_CONTENT_TYPE")可以获得这个字符串。
参考技术A 服务器端用了stream组件
上传的时候是2进制的,用stream获得的数据也是二进制的..
再把数据流保存成文件..好像就是这样

如何将 multipart/form-data 发送到 ASP.NET Core Web API?

【中文标题】如何将 multipart/form-data 发送到 ASP.NET Core Web API?【英文标题】:How to send multipart/form-data to ASP.NET Core Web API? 【发布时间】:2019-06-22 00:03:03 【问题描述】:

我正在尝试将图像和文本字段发送到 API 端点,但我收到了

不支持的内容类型'multipart/form-data; 边界=----------------------------81801171514357

这是一个 ASP.NET Core 2.1 Web API。我有这个:

[HttpPost("/api/account"), Authorize]
public void SaveUser(UserModel info)

还有我的模特:

    [JsonProperty(PropertyName = "avatar")]
    [DataType(DataType.Upload)]
    public IFormFile Avatar  get; set; 

    [JsonProperty(PropertyName = "name")]
    [DataType(DataType.Text)]
    public string Name  get; set; 

那我用axios:

    var formData = new FormData();
    formData.append("avatar", imageFile);
    formData.append("name", name);
    axios.post("/api/account", formData);

我希望这个方法能够运行,而不是抛出异常。但是怎么做?我已经尝试添加:

[Consumes("application/json", "multipart/form-data")]

但没有成功。

然后我尝试了:

[HttpPost("/api/account"), Authorize]
public void SaveUser([FromForm]UserModel info)

方法运行,但 info 对象的属性为空:(

更新: 解决方案,不要使用 JsonProperty PropertyName。使用变量名。

【问题讨论】:

上传详细文件时应使用public void SaveUser(IFormCollection collection)。关注这个***.com/questions/53825794/… 是否有任何演示可以重现您的问题?我用你当前的代码做了一个测试,它工作正常。 我还有一个方法:[HttpPost("/api/avatar"), Authorize] public void SaveAvatar(IFormFile avatar) 没有问题。但是当我在模型中添加 IFormFile 和属性时,我得到“不支持的内容类型'multipart/form-data”。 现在,我发现我不能使用 JsonProperty 名称,我必须使用 Avatar 和 Name(属性名称)。然后它工作正常。可以设置属性的名称吗? 这就是解决方案。[***.com/questions/60275185/… 【参考方案1】:

这是您正在寻找的工作示例

控制器:

[HttpPost]
public async Task<IActionResult> SaveFile([FromForm] IFormFile file) 
  // Your code here

在你的模型内部:

public IFormFile File  get; set; 

如果您不需要,请更改async Task&lt;IActionResult&gt;...

【讨论】:

【参考方案2】:

也许您应该尝试使用[FromForm] 属性装饰控制器输入和模型? 在此处查看更多信息:web api parameters binding。

在给定的示例中,您的控制器操作应如下所示:

[HttpPost("/api/account"), Authorize]
public void SaveUser([FromForm]UserModel info)

在模型中:

[FromForm(Name="avatar")]
public IFormFile Avatar  get; set; 

[FromForm(Name="name")]
public string Name  get; set; 

【讨论】:

是的,我尝试添加,[FromForm] 那么我模型中的所有属性都是空的。 尝试在模型属性上添加这个属性。 我发现我不能使用 JsonProperty 名称,我必须使用 Avatar 和 Name(属性名称)。然后它工作正常。可以设置属性的名称吗? 使用应该在控制器动作和模型定义中使用 [FromForm] 属性。至少这对我有用。 这救了我的命!我为这个问题彻夜未眠。非常感谢@joostas

以上是关于ASP采用multipart/form-data方式上传数据,数据的结构是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

asp multipart/form-data 怎样传递参数

multipart/form-data和application/x-www-form-urlencoded的区别

curl 中multipart/form-data和application/x-www-form-urlencoded的区别

使用 JQuery AJAX 发送包含文件和附加 json 表单数据的 multipart/form-data

h5中formdata怎么添加file

怎么样使用Python发送form-data请求及拼接内容