【问题标题】:Upload a file and data in same API call c#在同一 API 调用 c# 中上传文件和数据
【发布时间】:2020-12-08 11:39:38
【问题描述】:

经过大量研究,我发布了这个问题,因为我自己无法弄清楚。

场景是我需要将以下参数传递给Web API 2 controller in .Net framework 4.8 中的HttpPost 请求:

  • 日期 -> 日期对象
  • 作者 -> 字符串
  • 标题 -> 字符串
  • 内容 -> 字符串
  • 图像 -> 文件对象

我的前端 Angular 代码是:

saveNewsArticle(data) {
    return new Observable(observer => {
      let apiStr = this.apiStrBase + "SaveNewsArticle";

      let formData = new FormData();
      formData.append('date', data.publishDate);
      formData.append('author', data.author);
      formData.append('title', data.title);
      formData.append('image', data.image);
      formData.append('content', data.content);

      this.httpClient.post(apiStr, formData).subscribe((result) => {
        observer.next({ result: true, data: result });
      },
        error => {
          observer.next({ result: false });
        }
      );
    });
  }

我的 C# 代码是:

   [HttpPost]
   public void SaveNewsArticle()
   {
       var date = HttpContext.Current.Request.Params["date"];
       var author = HttpContext.Current.Request.Params["author"];
       var title = HttpContext.Current.Request.Params["title"];
       var content = HttpContext.Current.Request.Params["content"];
       var image = HttpContext.Current.Request.Files.Count > 0 ? HttpContext.Current.Request.Files[0] : null;
   }

所有这些都可以正常工作,但是,我使用 WYSIWYG 编辑器来获取文本的样式,因此 contenthtml,例如

这是我的内容

,我在 c# 中收到此错误:

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client

以下是我迄今为止尝试过的:

  1. 我不想使用<httpRuntime requestValidationMode="2.0" />

  2. 我可以将它作为模型传递public void SaveArticle(Article article) 一切都很好,但图像始终是null

  3. 我可以替换 ' 和 '>' 并解决问题 对我来说,但这不是应该这样做的。这是一个黑客。

  4. 在 MVC 中,我们可以只使用 [ValidateInput(false)][AllowHtml] 但不能在Web API 2上使用。

  5. 我是否应该实现一个自定义格式化程序来处理 multipart/form-data 就像完成 here 一样

非常感谢任何帮助/指导。

【问题讨论】:

  • 可以分享Article类的代码吗?如果您使用 article 作为 Post Body in Action 方法,您将如何尝试访问 image
  • 和我开始在场景中描述的参数一样
  • @ChetanRanpariya 您建议的答案使用IFormFile,它是.NetCore 的一部分,而我正在使用.Net framework。请不要投票关闭此答案。如果这么简单,我一开始就不会发布这个问题。
  • @CodeWarrior 这是您收到的唯一异常消息吗?关于危险表单数据的一行?还是在告诉您没有合适的MediaTypeFormatter 可用?你可以只上传图片吗?如果不是,则关于 multipart/form-data 类型请求存在配置或格式化程序问题。

标签: c# file-upload asp.net-web-api2 multipartform-data form-data


【解决方案1】:

向控制器提交 HTML 代码的其他方法是

  1. 以 base 64 字符串形式提交
  2. 作为 HTML 编码字符串提交

我个人认为base 64更直接,在哪里

JavaScript(编码)

formData.append('content', btoa(data.content));

C#(解码)

var content = Encoding.UTF8.GetString(Convert.FromBase64String(HttpContext.Current.Request.Params["content"]));

【讨论】:

  • 干杯伙伴:)
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多