ASP.NET MVC - 我在数据库中存储和显示图像时遇到问题

时间:2009-08-31 23:51:50

标签: c# asp.net-mvc database image

自从星期五以来,我一直把头发拉出来,我疯了。我希望用户能够提交带有图像的表单,并将该图像存储到数据库中。然后我想在索引视图上显示该图像。

我已经在这里尝试了所有其他stackoverflow帮助主题,但没有一个对我有效。

我正在遵循Steven Sanderson的“Pro ASP.NET MVC框架”中的指示(第195-198页),它只是不起作用。它适用于本书附带的示例应用程序。

我创建了一个测试MVC应用程序,它具有索引和创建视图。它正在为数据库保存一些内容,因为我可以看到填充了这两个单词的“二进制数据”字段。但它不会显示。我不知道它是否会显示,因为我将图像保存到数据库中是错误的,或其他。

这里发布的代码太多了,但是我将一个简单的应用程序编译成了一个.zip文件,它正好显示了我想要完成的任务。我希望是允许的。你们中的一位MVC专家可以下载并告诉我我做错了什么以及为什么它不起作用?我对此非常敏感,我很困惑。

如果您需要更多信息,请与我们联系。

非常感谢, 肖恩

我的档案位于:http://www.fraxis.com/test.zip

它是使用Visual Studio 2008与.NET 3.5(SP1)和ASP.NET MVC 1.0构建的。

一切都在HomeController和Home视图中。索引和创建。数据库位于app_data。

3 个答案:

答案 0 :(得分:2)

在HomeController类中替换第52行:

image.InputStream.Read(TableToCreate.Image, 0, image.ContentLength);

这两行:

BinaryReader reader = new BinaryReader(image.InputStream);
TableToCreate.Image = reader.ReadBytes(image.ContentLength);

答案 1 :(得分:1)

查看此帖子。

Having troubles calling a Controller Post Method…

修改

然后我有以下内容来恢复图像;

控制器;

public FileResult GetImage(int id)
{
  return File(PhotoHelper.GetImageBytes(id), "image/jpeg");
}

在我看来;

<%= Html.Image("img", "/Photos/GetImage?id=" + Model.Photo.Id.ToString(), "BioPic", new { Width = "350px" })%>

基本上我已经将一个字节流保存到数据库然后检索它们,然后图像从我控制器中名为GetImage的动作中抓取该图像。

这会回答你的问题吗?

答案 2 :(得分:0)

Public int InsertUpdateImage(
        ref System.Data.SqlClient.SqlConnection _SqlConnection,
        string _SQL,
        System.Drawing.Image _Image,
        string _ImageFieldName,
        System.Drawing.Imaging.ImageFormat _ImageFormat)
{
    int _SqlRetVal = 0;

    try
    {
        // lets add this record to database
        System.Data.SqlClient.SqlCommand _SqlCommand
            = new System.Data.SqlClient.SqlCommand(_SQL, _SqlConnection);

        // Convert image to memory stream
        System.IO.MemoryStream _MemoryStream = new System.IO.MemoryStream();
        _Image.Save(_MemoryStream, _ImageFormat);

        // Add image as SQL parameter
        System.Data.SqlClient.SqlParameter _SqlParameter 
            = new System.Data.SqlClient.SqlParameter("@" + _ImageFieldName, SqlDbType.Image);

        _SqlParameter.Value = _MemoryStream.ToArray();
        _SqlCommand.Parameters.Add(_SqlParameter);

        // Executes a Transact-SQL statement against the connection 
        // and returns the number of rows affected.
        _SqlRetVal = _SqlCommand.ExecuteNonQuery();

        // Dispose command
        _SqlCommand.Dispose();
        _SqlCommand = null;
    }
    catch (Exception _Exception)
    {
        // Error occurred while trying to execute reader
        // send error message to console (change below line to customize error handling)
        Console.WriteLine(_Exception.Message);

        return 0;
    }

    return _SqlRetVal;
}