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<IActionResult>
...
【讨论】:
【参考方案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的区别