如何使用多部分上载将文件(图像)列表和json数据上载到ASP.NET Core Web API控制器?
我可以成功接收文件列表,上载的文件类型为multipart/form-data
,内容类型如下:
public async Task<IActionResult> Upload(IList<IFormFile> files)
当然,我可以使用默认的JSON格式化程序成功接收格式化为对象的HTTP请求主体,如下所示:
public void Post([FromBody]SomeObject value)
但是我如何在一个单独的控制器动作中组合这两个呢?如何上传图像和JSON数据并将它们绑定到对象?
有一个更简单的解决方案,受到安德里乌斯答案的强烈启发。通过使用modelbinderattribute
,您不必指定模型或绑定程序提供程序。这节省了大量的代码。您的控制器操作如下所示:
public IActionResult Upload(
[ModelBinder(BinderType = typeof(JsonModelBinder))] SomeObject value,
IList<IFormFile> files)
{
// Use serialized json object 'value'
// Use uploaded 'files'
}
JsonModelBinder
背后的代码(请参阅GitHub或使用NuGet包):
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
public class JsonModelBinder : IModelBinder {
public Task BindModelAsync(ModelBindingContext bindingContext) {
if (bindingContext == null) {
throw new ArgumentNullException(nameof(bindingContext));
}
// Check the value sent in
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueProviderResult != ValueProviderResult.None) {
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);
// Attempt to convert the input value
var valueAsString = valueProviderResult.FirstValue;
var result = Newtonsoft.Json.JsonConvert.DeserializeObject(valueAsString, bindingContext.ModelType);
if (result != null) {
bindingContext.Result = ModelBindingResult.Success(result);
return Task.CompletedTask;
}
}
return Task.CompletedTask;
}
}
下面是上面的控制器操作upload
接受的原始http请求的示例。
绑定到IFormFile
的文件还需要指定一个FileName
,如请求的第二部分所示。content-type
不是必需的。
另一个需要注意的是,json部分需要可以反序列化为controller操作中定义的参数类型。因此,在本例中,类型SomeObject
应该具有类型为String
的属性Key
。
POST http://localhost:5000/home/upload HTTP/1.1
Host: localhost:5000
Content-Type: multipart/form-data; boundary=12345
Content-Length: 218
--12345
Content-Disposition: form-data; name="value"
{"key": "value"}
--12345
Content-Disposition: form-data; name="files"; filename="file.txt"
Content-Type: text/plain
This is a simple text file
--12345--
可以使用Postman调用操作并测试服务器端代码。这是相当简单的,主要是UI驱动的。创建一个新的请求并在Body-Tab中选择form-data。现在您可以为Reqeust的每个部分在text和file之间进行选择。
我知道这是一个非常普遍的问题,但我无法在Angular 2中上传文件。我试过了 1) http://valor-software.com/ng2-file-upload/和 2) http://ng2-uploader.com/home ...但是失败了。有人用Angular上传过文件吗?你用了什么方法?如何做到这一点?如果提供任何示例代码或演示链接,我们将不胜感激。
本文向大家介绍PHP实现文件上传和多文件上传,包括了PHP实现文件上传和多文件上传的使用技巧和注意事项,需要的朋友参考一下 在PHP程序开发中,文件上传是一个使用非常普遍的功能,也是PHP程序员的必备技能之一。值得高兴的是,在PHP中实现文件上传功能要比在Java、C#等语言中简单得多。下面我们结合具体的代码实例来详细介绍如何通过PHP实现文件上传和多文件上传功能。 要使用PHP实现文件上传功能,
问题内容: 我正在使用Spring MVC,这是我的方法: 我需要在邮递员和文件中传递会话ID。我怎样才能做到这一点? 问题答案: 在邮递员中,将方法类型设置为 POST 。 然后选择主体->表单数据->输入参数名称(根据您的代码 文件 ) 且右侧旁边值列,会出现 下拉菜单“文本文件” ,选择 文件 。选择您的图像文件并将其发布。 对于其他基于 “文本”的参数 ,您可以像通常使用postman一样
我正在尝试使用多部分实体方法上传文件。但它失败,错误说{“错误”:“文件参数值'无'无效”} 我的代码是: File File = new File(" C:/Users/SST-06/Desktop/new . txt "); 我的实体文件包含所有提到的参数。 -hkYO-pblk 0 uqlxjtvklrbkosxz 7 mye-8 wbvbvanx Content-Disposition:f
问题内容: 我正在尝试在我的GAE应用程序中上传文件。如何使用Go和使用在Google App Engine中上载文件? 问题答案: 我设法通过使用中间返回参数“其他”解决了我的问题。以下这些代码位于上传处理程序中 然后分配相应的formkey 并在我的结构值分配中像这样使用它 并非100%肯定这是正确的做法,但这解决了我的问题,它现在将图像上传到blobstore,并将其他数据和blobkey保
问题内容: 我已经做了很多研究,找到了.NET的上载组件,可以用来上载大文件,具有进度条并可以继续上载大文件。我遇到了一些组件,例如AjaxUploader,SlickUpload和PowUpload,仅举几例。这些选项中的每一个都需要花钱,只有PowUpload可以执行断点续传,但是它使用Java applet来完成。我愿意为一个能够很好地完成这些工作的组件付费,但是如果我自己编写,那将是最好的