【问题标题】:Upload File to Web API将文件上传到 Web API
【发布时间】:2017-10-12 12:15:56
【问题描述】:

我有以下型号:

public class FileModel
{
  public byte[] FileData{get;set;}
  public string FileName {get;set;}
}

我编写了我的 Web 应用程序使用的私有 Web API 服务。 当用户上传文件时,我将这些文件转换为字节数组,并从 C# 代码(不是从 HTML 页面,因为我的 Web API 对我的网站是私有的)发送List<FileModel> 到我的 Web API,这会保存我的文件并返回结果。

Web API 方法:

[HttpPost]
public UploadFiles(List<FileModel> files)
{
// Do work
}

如果我上传许多大文件,上面的代码会中断 - 代码无法序列化大文件的FileModels,因为它们超过了最大序列化长度。

我该如何解决这个问题?有没有其他方法可以将文件上传到 Web API 而不会暴露给用户?

【问题讨论】:

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

将此添加到您的 web.config 文件中。

<configuration>
   <system.web>
      <httpRuntime maxRequestLength ="1999999"/>
</system.web>
</configuration>

同时增加 MVC config 文件中的内容长度。

<system.webServer> 
  <security> 
      <requestFiltering> 
         <requestLimits maxAllowedContentLength="1999999999" /> 
      </requestFiltering> 
  </security>
<system.webServer>

maxRequestLength 值以千字节为单位。

maxAllowedContentLength 值以字节为单位。

您可以根据需要更改以上尺寸。

【讨论】:

  • 谢谢,但 maxRequestLength 不是我的问题的原因。
  • 当我使用 httpClient.PostAsJsonAsync>("API URL",postObj)。我返回未找到 Web API 方法的响应。
  • 但这仅适用于大文件
  • 我认为 httpClient 无法将我的对象序列化为 Json 并发送空对象,因此我得到 Web API 方法未找到响应。这是我的最佳猜测。
  • 我的 web.config 内容长度:
【解决方案2】:

以下是针对这种情况的一些解决方案。

您的控制器操作将不接受代码 sn-p 中显示的任何参数。

public async Task<HttpResponseMessage> PostByteArrayAsync()
{
       string root = HttpContext.Current.Server.MapPath("~/folder");
       var provider = new MultipartFormDataStreamProvider(root);
       await Request.Content.ReadAsMultipartAsync(provider);
       foreach (var file in provider.FileData)
       {
             var buffer = File.ReadAllBytes(file.LocalFileName);
             // store to db and other stuff
       }
       return Ok();
}

以及上面的前端示例代码。

UploadData(event) {
        this.setState({ loading: true });
        event.preventDefault();
        let data = new FormData();
        let fileData = document.querySelector('input[type="file"]').files[0];
        data.append("data", fileData);
        let that = this;
        fetch("api/upload", {
            method: "POST",
            "Content-Type": "multipart/form-data",
            "Accept": "application/json",
            body: data
        }).then(function (res) {
            if (res.ok) {
                call('api', 'GET').then(response => { response.error ? response.message : that.props.change(response); that.setState({ loading: false }) });
            }
            else {
                that.setState({ loading: false });
                that.failedMsg();
            }
        })
    }

【讨论】:

  • 您好,感谢您的回复,但我没有尝试将文件直接发布到我的 Web API。我正在将文件发布到我的 MVC 操作控制器并将我的控制器操作 POST 文件发送到我的 Web API。我不希望我的 Web API url 公开,因为它是私有的(即特定于我的网站)
猜你喜欢
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多