Asp.net mvc 3 ASP.NET MVC3:上载图像并将其保存到数据库

Asp.net mvc 3 ASP.NET MVC3:上载图像并将其保存到数据库,asp.net-mvc-3,file-upload,Asp.net Mvc 3,File Upload,我正在写史蒂文·桑德森的书(Pro ASP.NET MVC 3)。我在p。294我逐字抄写了书中的内容,但不起作用 这就是行动方法 public ActionResult Edit(Product product, HttpPostedFileBase image) { if(ModelState.IsValid) { if(image != null) { product.ImageMimeType = image.ContentType; pr

我正在写史蒂文·桑德森的书(Pro ASP.NET MVC 3)。我在p。294我逐字抄写了书中的内容,但不起作用

这就是行动方法

public ActionResult Edit(Product product, HttpPostedFileBase image)
{
  if(ModelState.IsValid)
  {
    if(image != null)
    {
      product.ImageMimeType = image.ContentType;
      product.ImageData = new byte[image.ContentLength];
      image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
    }

    //...Save product in the database using Entity Framework
  }
}
这是如何在razor页面上显示图像

<img width="150" height="150"
  src = "@Url.Action("GetImage", "Home", new { Model.ProductID })" /> 
编辑

我从开始到结束都遵循了整个过程(在调试过程中),我可以说:

  • 按下视图上的“保存”按钮后,HttpPostedFileBase对象不为空

  • 调用db.SaveChanges()方法后,在数据库的表中添加一行

  • 调用GetImage时,它不会返回null

  • 但是在视图上没有显示图像

    谢谢你的帮助


  • 文件
    应该是
    FileContentResult
    ,因为它是字节,而不是磁盘上的实际文件。和
    img
    应该是
    prod
    ,对吗

    public FileContentResult GetImage(int productID)
    {
        Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productID);
        if (prod != null)
        {
            return new FileContentResult(prod.ImageData, prod.ImageMimeType);
        }
        else
        {
            return null;
        }
    }
    

    下面是让Steven Sanderson示例正常工作的答案,更改保存过程如下:

                if (image != null)
                {
    
                    var product = new Product();
    
                    product.FileName = image.FileName; //<- optional filename
                    product.ImageMimeType = image.ContentType;
                    int length = image.ContentLength;
                    byte[] buffer = new byte[length];
                    image.InputStream.Read(buffer, 0, length);
                    product.ImageData = buffer;
    
                  //Save product to database 
    
                }
    
    if(图像!=null)
    {
    var product=新产品();
    
    product.FileName=image.FileName;//修改您的操作方法,如下所示:

    <img width="150" height="150" src = "@Url.Action("GetImage", "Home", new { @id = Model.ProductID })" /> 
    


    作为
    src
    属性的值?如果是后者,这肯定会解决问题。如果是前者,您可能需要启用
    GET
    请求。

    我也有同样的问题。 只需将控制器中的编辑方法部分更改为如下内容:

     if (image != null)
                {
                    mvcImages img = db.mvcImages.Where(p => p.p_id == prod.p_id).FirstOrDefault();
                    prod.p_imageMimeType = image.ContentType;
                    byte[] buffer = new byte[image.ContentLength];
                    image.InputStream.Read(buffer, 0, image.ContentLength);
                    prod.p_imageData = buffer;
                    img.p_imageMimeType = prod.p_imageMimeType;
                    img.p_imageData = prod.p_imageData;
                    db.SaveChanges();
                }
    
    那很好。
    还请记住将更改保存在与“if”命令相同的括号内。

    更简单的解决方法是只更改产品类中的以下行:

    更改为:

    public byte ImageData {get;set;}
    
    public byte ImageData {get;set;}
    
    致:


    我遇到了同样的问题..试试这个:

    public ActionResult Edit(Product product, HttpPostedFileBase image)
    {
      if(ModelState.IsValid)
      {
         if(image != null)
         {
           product.ImageMimeType = image.ContentType;
           product.ImageData = new byte[image.ContentLength];
    
           iname.InputStream.Position = 0; // This is what makes the difference
    
           image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
         }
    
    //...Save product in the database using Entity Framework
    

    }

    问题在于行动方法。。 应该是
    您必须更改控制器的de名称。。。“GetImage”函数位于“Admin”控制器中。。代码的其余部分很好…

    只需打开实体文件夹中的Products.cs文件并进行更改

    致:


    @bzlm。我刚刚编辑了这个问题。它没有显示在视图上。当它显示控制器上的图像对象不为空时,会在数据库中添加一行,GetImage也会返回一个值,但视图上没有任何内容,即显示alt消息。然后,您应该将问题集中在查看图像不起作用的原因上。如果您确定该图像存在于数据库中,并且确保正确加载该图像,则显示该图像的操作方法有问题。
    GetImage
    (使用FireBug或Fiddler或类似工具)发送到浏览器的实际HTTP响应是什么?很抱歉,我在编写时出错了。是prod而不是img,但这并没有改变任何事情。此外,在使用FileContentResult时,我会收到以下消息:“FileContentResult是一个类型,但它被当作变量使用”@Richard77-对不起,我也有一个类型。。。忘记了
    new
    关键字。添加new后,我再也没有收到错误。不幸的是,我仍然无法显示任何内容。我相信这与我保存文件的方式有关。就在飓风艾琳之前,我在stackoverflow上看到了一个类似的问题。但是,我没有为页面添加书签,断电后,我也丢失了页面。有人提出了一种在控制器中处理HttpPostedFileBas的不同方法,这对他很有效。但是,我找不到线索。@Richard77-你的ImageMimeType是什么。。。它是否是正确的内容类型,如“image/jpeg”,请简要说明您的答案,以便对OP和其他读者更有用。
    public byte ImageData {get;set;}
    
    public byte[] ImageData{get;set;}
    
    public ActionResult Edit(Product product, HttpPostedFileBase image)
    {
      if(ModelState.IsValid)
      {
         if(image != null)
         {
           product.ImageMimeType = image.ContentType;
           product.ImageData = new byte[image.ContentLength];
    
           iname.InputStream.Position = 0; // This is what makes the difference
    
           image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
         }
    
    //...Save product in the database using Entity Framework
    
    public byte ImageData {get;set;}
    
    public byte[] ImageData{get;set;}