使用FileContentResult操作方法发送文件以查看的困难

时间:2010-07-06 10:44:01

标签: asp.net-mvc file-io

我需要以这种方式在视图中显示图像

<img src = <% = Url.Action("GetImage", "Home", new { productID })%>

这是应该提供数据的动作

public FileContentResult GetImage(int ID)
{
  var img = db.Images.Where(p => p.ID == ID).First();
  return File(img.ImageData, img.ImageMimeType);
}

此示例来自Pro ASPNET.NET MVC(Steven Sanderson / APress)。我收到以下错误: System.Web.Mvc.Controller.File(string,string)的最佳重载方法匹配有一些无效的参数。 无法从System.Data转换。 Linq.Binary to string。

然而,intellisense告诉我有一个重载方法(byte [] filecontents,string fileType)。但是,当我写上面的代码时,我得到了错误。我错过了什么吗?

修改

感谢您的回答。我在上传图片文件时遇到了类似的问题。这是我的行动方法

public ActionResult AddImage(HttpPostedFileBase image)
{
  if(image != null)
    {
      var img = new Image();//This Image class has been 
                            //created by the DataContext
      img.ImageMimeType = image.ImageMimeType
      img.ImageData = new byte[image.ContentLength];
      image.InputStream.Read(img.ImageData, 0, image.ContentLength);
    } 
}

我收到最后一行的错误“ image.InputStream.Read(myImage.ImageData,0,image.ContentLength); 它说它无法转换System.Data .Linq.Binary to Byte []

我所做的是(i)创建一个名为 ImageDataClass 的新类,(ii)对该类进行上述操作,(iii)从ImageDataClass到Image进行显式转换,以及(iv)使用Linq保存到数据库。

我认为不应该那么复杂。是否有任何方法可以使用简单的扩展方法,如 ToArray ,以及其他情况???

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

File()有一个带有字节数组的重载,但是你试图传入一种System.Data.Linq.Binary,而不是一个字节数组。但是,Binary上有一种方法可以转换为字节数组。

试试这个:

public FileContentResult GetImage(int ID)
{
  var img = db.Images.Where(p => p.ID == ID).First();
  return File(img.ImageData.ToArray(), img.ImageMimeType);
}

编译错误提到“字符串”的原因纯粹是因为它无法解决您正在尝试的过载,因此它只选择一个,在本例中为字符串,然后报告类型转换错误。

[编辑:响应OP编辑]

你应该可以尝试这样的事情:

public ActionResult AddImage(HttpPostedFileBase image)
{
  if(image != null)
    {
      var img = new Image();//This Image class has been 
                            //created by the DataContext
      img.ImageMimeType = image.ImageMimeType
      var imageData = new byte[image.ContentLength];
      image.InputStream.Read(imageData, 0, image.ContentLength);
      img.ImageData = new System.Data.Linq.Binary(imageData);
    } 
}

请记住,尽管System.Data.Linq.Binary可能只是下面的一个字节数组,或者至少是为了表示字节数据,但它本身并不是byte[]类型;你仍然需要转换成(与System.IO.MemoryStream相似的情况)