ASP.NET MVC3:通过控制器加载图像
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; } }
当我打开页面时,出现一个错误,显示"无法访问已关闭的文件"。我在搜索引擎上查了一下这个错误,但只找到与上传相关的错误。是什么原因导致了这个问题?
原因:在代码中,使用了`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`的流时,这个流已经被关闭了。