【问题标题】:web api 2 file upload errorweb api 2文件上传错误
【发布时间】:2014-06-05 16:26:48
【问题描述】:

我正在使用此代码处理文件上传到 web api:

[HttpPost]
public async Task<IHttpActionResult> Post(string provider)
{  
    if (!Request.Content.IsMimeMultipartContent())
        throw new Exception();

    var streamProvider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(streamProvider); // FAILS HERE
    foreach (var file in streamProvider.Contents)
    {
        var imageFilename = file.Headers.ContentDisposition.FileName.Trim('\"');
        var imageStream = await file.ReadAsStreamAsync();

    }
}

但是这里会报错:await Request.Content.ReadAsMultipartAsync(streamProvider);

错误是:读取 MIME 多部分正文部分时出错。 内部异常是:

{"Cannot access a disposed object."}

关于为什么会出现此错误的任何想法?

【问题讨论】:

  • 最好添加 try catch 块
  • @user3629247 他已经有了例外,为什么他需要一个trycatch?如果他忽略了这个问题,他就不会在这里发帖
  • @user441365 您是否使用了正确的 Content-Type 标头值?又名 Content-Type: multipart/form-data
  • 如果我们将方法包装在 try-catch 块中,我们可以优雅地处理作为方法一部分发生的任何错误。对于这种情况,他已经捕获了异常
  • 你在使用enctype属性吗?

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


【解决方案1】:

我遇到了类似的问题,但提供的解决方案对我不起作用,所以这是我的:您上传的文件不符合 IIS 的安全限制。

http://forums.asp.net/t/2062896.aspx?Error+reading+MIME+multipart+body+part+when+upload+image

<system.web>
    <httpRuntime maxRequestLength="30000000" /> <!-- if you forget this one it does not work -->
</system.web>

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

【讨论】:

    【解决方案2】:

    你试过了吗?

    [HttpPost]
    public async Task<IHttpActionResult> Post(string provider)
    {  
        if (!Request.Content.IsMimeMultipartContent())
            throw new Exception();
    
        var streamProvider = await Request.Content.ReadAsMultipartAsync(); // HERE
        foreach (var file in streamProvider.Contents)
        {
            var imageFilename = file.Headers.ContentDisposition.FileName.Trim('\"');
            var imageStream = await file.ReadAsStreamAsync();
        }
    }
    

    看起来应该是这样称呼的。

    【讨论】:

    • 如果我准确地复制这段代码,我会在// HERE 注释的行上得到已处理的错误:/
    【解决方案3】:

    我也有同样的例外,但原因不同。我的 Post 方法的返回类型为 void。一旦我将返回类型更改为Task&lt;[T]&gt;,在我的例子中是字符串类型,它就开始工作了。

    【讨论】:

    【解决方案4】:

    您不应该有存储上传文件的路径吗?像这样的:

    var streamProvider = new MultipartMemoryStreamProvider(@"C:\Uploads");
    

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2020-01-13
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多