Asp.net mvc 3 ASP.NET MVC3:上载图像并将其保存到数据库
我正在写史蒂文·桑德森的书(Pro ASP.NET MVC 3)。我在p。294我逐字抄写了书中的内容,但不起作用 这就是行动方法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
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;}