【问题标题】:Cannot access a closed file when uploading to memory stream上传到内存流时无法访问已关闭的文件
【发布时间】:2015-07-26 19:32:48
【问题描述】:

我正在尝试创建一个控制器,允许我将图像保存到我的数据库中。到目前为止,我有这段代码:

/// <summary>
/// Handles an upload
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("")]
public async Task<IHttpActionResult> Upload()
{

    // If the request is not of multipart content, then return a bad request
    if (!Request.Content.IsMimeMultipartContent())
        return BadRequest("Your form must be of type multipartcontent.");

    // Get our provider
    var provider = new MultipartFormDataStreamProvider(ConfigurationManager.AppSettings["UploadFolder"]);

    // Upload our file
    await Request.Content.ReadAsMultipartAsync(provider);

    // Get our file
    var file = provider.Contents.First();
    var bytes = await file.ReadAsByteArrayAsync();

    // Using a MemoryStream
    using (var stream = new MemoryStream(bytes))
    {

        stream.Seek(0, SeekOrigin.Begin);

        // Create the data
        var data = "data:image/gif;base64," + Convert.ToBase64String(stream.ToArray());

        // Return the data
        return Ok(data);
    }
}

但它不起作用。 当我进入 using 块时,我收到一条错误消息:

“将内容复制到流时出错。”
“无法访问已关闭的文件。”

有人知道为什么吗?

【问题讨论】:

  • 您能否在下面查看我的回答,看看它是否对您有帮助?
  • 如果您可以将我的回复标记为答案,或者如果它没有帮助提供一些反馈,那么我可以更新我的答案以更好地帮助您。
  • 感谢您将我的标记为答案! :)

标签: c# file-upload asp.net-web-api


【解决方案1】:

发生这种情况的原因是 MultipartFormDataStreamProvider 在将上传的数据写入您在将其传递给构造函数时提供的文件位置后关闭并处理上传的文件流:ConfigurationManager.AppSettings["UploadFolder"]

要访问已上传的文件,您需要从上传的文件位置查阅磁盘上的文件数据:

所以在你的例子中你的代码需要使用这个:

// Read the first file from the file data collection:
var fileupload = provider.FileData.First;

// Get the temp name and path that MultipartFormDataStreamProvider used to save the file as:
var temppath = fileupload.LocalFileName;

// Now read the file's data from the temp location.
var bytes = File.ReadAllBytes(temppath);

此外,如果您使用非常小的文件,您可以改用:

MultipartMemoryStreamProvider

这会将文件数据存储在内存中,并且应该可以按预期工作。请注意,如果您使用的是大文件 (25mb+),最好先流式传输到磁盘,否则您可能会出现内存不足异常,因为 .net 试图将整个文件保存在内存中。

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2019-02-06
    • 2021-08-30
    • 2011-12-27
    • 2012-06-11
    • 2021-12-21
    • 2017-01-12
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多