Mvc Release Candidate“File”ActionResult

时间:2009-02-01 12:46:52

标签: c# asp.net-mvc

K ......我做的事情显然是错的。我有一个带有文件输入控件的简单页面和一个提交按钮。我正在尝试用Mvc RC发布的新“File”ActionResult ......

所有,我想要发生的是当点击提交按钮时,所选文件被上传到数据库。这一切都很好......

然后,在页面刷新后,我希望图像显示上传的结果图像。问题是图像没有渲染......我得到了破碎的图像......

这是获取文件并将其发送回视图的部分...

        var a = Helper.Service.GetAttachmentById(id, MembershipProvider.SecurityTicket);

        if (a == null)
        {
            return View(new ImagePlaceHolderViewData(new { Id = id }));
        }
        return View(new ImagePlaceHolderViewData(new { Id = a.Id, Image = a, FileContent = File(a.Data, a.ContentType) }));

然后在视图中我有一个像这样的图像标签...

<img src="<%=Model.FileContent.FileContents %>" />

我也试过......

<img src="<%=Model.FileContent%>" />

思考..?

3 个答案:

答案 0 :(得分:7)

FileResult返回文件的ASCII或二进制内容。当你说要做以下事情时:

<img src="<%=Model.FileContent.FileContents %>" />

您正在尝试将二进制图像数据推送到src属性。这将永远不会起作用,因为src必须是URL或图像的路径。

有几种方法可以做你想要的,在这种情况下最正确的解决方案是创建一个新的控制器来返回你正在尝试的二进制数据,然后设置src属性成为纠正新控制器操作的路径。 E.g:

<img src="/image/result/12345" />

这指向以下(非常简单和不完整)示例控制器:

public class ImageController : Controller
{
    public ActionResult Result(int resultID)
    {
        // Do stuff here...

        return File(..);
    }
}

请注意,我为该操作选择的名称很可能没有任何好处,但它可以作为一个例子。希望这有用。

答案 1 :(得分:3)

我认为这很简单:你的img标签的src属性需要一个URL。你在这里做的只是将FileStream对象放在那里(它隐式调用该对象上的ToString方法)。你得到的html可能是这样的:

<img src="FileStream#1" />

你检查过你的HTML源吗?

您可能应该做的是提供一种方法,该方法返回数据,并将路径传递给您的视图。你得到的html'应该'看起来像这样:

<img src="/Images/View/1" />

因此,您需要做的步骤是:

  • 在控制器上创建一个返回FileContentResult
  • 的方法
  • 将您的图片ID传递给您的视图
  • 使用Url.RouteUrl生成一个可以放入img标记的网址,该网址指向返回图像数据的方法。

答案 2 :(得分:1)

还有另一种解决方案:

<img src="data:image/gif;base64,<%=Convert.ToBase64(Model.FileContent)%>"/>

<img src="data:image/gif;base64,<%=Convert.ToBase64(Model.FileContent)%>"/> 它适用于某些浏览器,而不是某些浏览器(IE!当然)。但稳定的解决方案是Thomas J所提到的。