当前位置: 首页 > 知识库问答 >
问题:

如何使用Web API上传文件和模型?

张承颜
2023-03-14

基本上,我正在尝试使用Web API 2上传图像和枚举。

这是控制器签名:

[HttpPost]
public UploadResponseVm Upload([FromBody]ResImageType type)
{

问题是,每当我尝试发布一个多部分表单(包含一个文件和一个类型)时,我都会收到一个415错误:

{“Message”:“此资源不支持请求实体的媒体类型‘multipart/form data’。”,“ExceptionMessage”:“没有MediaTypeFormatter可用于从媒体类型为“multipart/form data”的内容中读取“ResImageType”类型的对象。”,“ExceptionType”:“System.Net.Http.UnsupportedMediaTypeException”,“StackTrace”:“在System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent内容,类型,IEnumerable1格式化程序,IFormatterLogger格式化程序记录器,CancellationToken CancellationToken)\r\n在System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage请求,类型类型,IEnumerable1格式化程序,IFormatterLogger格式化程序记录器,CancellationToken CancellationToken)“}

我甚至在我的startup.cs课上增加了以下内容:

    config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());

如何使用web api控制器上载模型和文件?

共有2个答案

钱选
2023-03-14

您可以通过在标头请求中添加内容类型来简单地同时添加媒体和枚举。

Content-Type:application/x-www-form-urlencoded

然后尝试访问文件和枚举

[HttpPost]
public UploadResponseVm Upload()
{
            //Get enum type
            var enumkey = HttpContext.Current.Request.Form.AllKeys.FirstOrDefault(x => x == "enumkey");
            var enumType = Convert.ToInt32(HttpContext.Current.Request.Form[enumkey]).ToEnum<ResImageType>();

            //Access files
            var postedFileLst = HttpContext.Current.Request.Files.GetMultiple("fileKey").ToList();
}

使用扩展方法转换为枚举

public static T ToEnum<T>(this int param)
{
            var info = typeof(T);
            if (info.IsEnum)
            {
                T result = (T)Enum.Parse(typeof(T), param.ToString(), true);
                return result;
            }

            return default(T);
}

还可以使用curl进行验证

curl --location --request POST '{{hostname}}/api/media/addmedia' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--form 'BookLogos=@/path/to/file' \
--form 'enumkey=1'
宦翔
2023-03-14

没有格式设置程序可以处理/关联您的ResImageType对象。我曾经在没有格式化程序的情况下通过使用无参数方法解决过类似的问题,并在方法中处理了数据。例如:

public async Task<HttpResponseMessage> PostFormData()
    {
        if (!Request.Content.IsMimeMultipartContent("form-data"))
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }

            string upDir= "PathOfDirectory";

            MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(upDir);                
            MultipartFileStreamProvider multipartFileStreamProvider = await Request.Content.ReadAsMultipartAsync(streamProvider);

            // Loop through files.
            foreach (MultipartFileData file in streamProvider.FileData)
            {
                // Save filepaths to DB or do something else
            }
            return Request.CreateResponse(HttpStatusCode.OK);
    }

MS Docs的类似解决方案

另一种可能是创建一个类似DTO的类,用于传输对象并使用格式化程序,例如MultipartDataMediaFormatter似乎是合法的(尚未尝试)。

 类似资料:
  • 问题内容: 我想通过ajax调用使用WebApi上传文件,该文件将保存到数据库中。我尝试了此链接中 给出的代码 。在这里,它将接收到的数据作为未指定扩展名的文件保存到硬盘驱动器中,但是我想要执行类似将文件保存到数据库时的操作,我也想保存文件名和扩展名原因,如果以后需要要下载文件,我可以提供文件名和扩展名。并在链接中将文件作为文件保存到硬盘,但是有什么方法可以直接将文件保存到DB。 问题答案: 答案

  • 问题内容: 谁能告诉我如何使用nodejs和HAPI上传文件? 我在处理程序中获取二进制数据。 这是我的html代码: 这是我的Nodejs代码: 问题答案: 最后,我得到了使用HAPI上传大型文件的解决方案,并感谢Roman。 解决方法如下: server.js代码 处理程序代码:

  • 问题内容: 当我使用XMLHttpRequest时,使用可以正确上传文件。但是,当我切换到时,我的代码将中断。 这是有效的原始代码: 这是我失败的尝试: 我究竟做错了什么?如何使用AJAX正确上传文件? 问题答案: 您必须添加方法,以便jQuery不会更改标头或数据(这会破坏当前代码)。

  • 问题内容: 我想知道如何使用cURL或PHP中的任何其他文件上传文件。我在Google中搜索了很多次,但没有结果。 换句话说,用户看到表单上的文件上传按钮,该表单被发布到我的php脚本中,然后我的php脚本需要将其重新发布到另一个脚本(例如,在另一个服务器上)。 我有此代码来接收文件并上传 代码: 我希望代码将文件发送到接收者文件。 问题答案: 采用:

  • 我正在尝试使用多部分实体方法上传文件。但它失败,错误说{“错误”:“文件参数值'无'无效”} 我的代码是: File File = new File(" C:/Users/SST-06/Desktop/new . txt "); 我的实体文件包含所有提到的参数。 -hkYO-pblk 0 uqlxjtvklrbkosxz 7 mye-8 wbvbvanx Content-Disposition:f

  • 我可以使用将文件上载为 上面的代码运行良好。 现在,我想对同一作业使用。我试着在网上搜索并实现代码。但我无法得到结果。 html代码如下所示: 代码中没有任何形式。如何解决问题?