ASP.NET MVC3:通过控制器加载图像

8 浏览
0 Comments

ASP.NET MVC3:通过控制器加载图像

我尝试使用这里的答案,但没有成功。我有以下代码:

public ActionResult ShowImage() 
{
    using (FileStream stream = new FileStream(Path.Combine(Server.MapPath("/App_Data/UserUpload/asd.png")), FileMode.Open))
    {
        FileStreamResult result = new FileStreamResult(stream, "image/png");
        result.FileDownloadName = "asd.png";
        return result;
    }
}

当我打开页面时,出现一个错误,显示"无法访问已关闭的文件"。我在搜索引擎上查了一下这个错误,但只找到与上传相关的错误。是什么原因导致了这个问题?

0
0 Comments

原因:在代码中,使用了`FileStream`来读取图像文件,并将其传递给`FileStreamResult`作为返回结果。然而,在代码中使用了`using`语句来包装`FileStream`,这意味着在控制器操作返回之前,这个流将被关闭。

解决方法:将代码修改为直接使用`File`方法来返回图像文件。这样可以避免在控制器操作返回之前关闭流。

整理成的文章如下:

尝试这样做:
public ActionResult ShowImage() 
{
    var file = Server.MapPath("~/App_Data/UserUpload/asd.png");
    return File(file, "image/png", Path.GetFileName(file));
}
或者如果你想要一个单独的文件名:
public ActionResult ShowImage() 
{
    var path = Server.MapPath("~/App_Data/UserUpload");
    var file = "asd.png";
    var fullPath = Path.Combine(path, file);
    return File(fullPath, "image/png", file);
}
这样做可以解决问题,谢谢!但是我还是有点好奇,为什么我之前的代码不起作用呢?
在你之前的代码中,你使用了`FileStream`来读取图像文件,并将其传递给`FileStreamResult`作为返回结果。然而,在你的代码中使用了`using`语句来包装`FileStream`,这意味着在控制器操作返回之前,这个流将被关闭。但是控制器操作的执行会在MVC流水线中被延迟执行,当它尝试使用你传递给`FileStreamResult`的流时,这个流已经被关闭了。

0