从MVC控制器将图像渲染到屏幕

Jos*_*osh 4 image asp.net-mvc-2

我在数据库中有图像,我想返回图像以便从动作中查看.这是我的行动.

public FileContentResult Index(ItemImageRequest request)
{
    var result = queueService.GetItemImage(request);

    if (result.TotalResults == 0)
        return File(new byte[0], "image/jpeg");

    var image = result.FirstResult;

    return File(image.Image, "image/tif");
}
Run Code Online (Sandbox Code Playgroud)

我也试过这段代码

public FileStreamResult Index(ItemImageRequest request)
{
    //retrieval omitted

    var image = result.FirstResult;

    System.IO.Stream stream = new System.IO.MemoryStream(image.Image);

    return new FileStreamResult(stream, "image/tif");
}
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中执行操作时,它会提示我下载.我不希望它下载,我希望它在浏览器中显示.我该如何做到这一点?

Wil*_*ean 8

如果你使用return Controller.File(filename, ...),你将返回一个FilePathResult,这可能不是你想要的 - 我假设你的样本中的'image'是一个图像文件名('var'没有帮助任何人的情况...... )

如果您使用其他File重载之一,或直接使用FileContentResult或FileStreamResult,您将获得所需的效果.

您不需要创建自定义的ActionResult类(当然,它可能因其他原因而有用.)

但是,刚刚写完所有这些,我意识到你的问题是TIFF不是一种文件格式,浏览器总是(永远?)在内部显示,这可能是他们提示下载的原因.

您需要将其重新渲染为PNG或服务器上的某些内容才能在浏览器中显示.


Joh*_*zen 5

所述File的ActionResult添加一行到这样的HTTP标头:

Content-disposition: attachment; filename=foo
Run Code Online (Sandbox Code Playgroud)

这将导致浏览器尝试下载该文件.这就是指定文件名的重载原因.

您可以创建自己的ActionResult来进行下载,并省略Content-disposition.

如果你想复制和粘贴,我在codeplex上有一个代码:ImageResult.cs