【问题标题】:ASP.NET store Image in SQL and retrieve for Asp:ImageASP.NET 在 SQL 中存储 Image 并检索 Asp:Image
【发布时间】:2010-10-16 11:34:19
【问题描述】:

我希望在 updateprofilepicture 页面上将图片 jpeg、gif 等文件上传到 SQL 数据库中。然后在配置文件页面上,我想从 sql 数据库中检索图像并将其显示在 Asp:Image 控件中。我有很多代码试图做到这一点,但它不起作用。该表包含一个 Image 类型的列。

【问题讨论】:

    标签: asp.net sql image


    【解决方案1】:

    正如 Joel 所说,您应该使用 HttpHandler 或页面来显示图像。这是输出图像的示例代码(Image.ashx):

    // ProcessRequest method of Image.ashx
    long imageId = Convert.ToInt64(Request.QueryString["ImageId"]);
    
    using (var conn = new SqlConnection(connectionString))
    using (var command = new SqlCommand(
        "SELECT ImageFile FROM ImageTable WHERE ImageId = @ImageID", conn))
    {
        command.Parameters.Add("@ImageID", SqlDbType.Int).Value = imageId;
        conn.Open();
    
        Response.ContentType = "image/gif";
        Response.BinaryWrite((byte[]) command.ExecuteScalar());
    }
    

    然后在您的页面中使用图像:

      <asp:Image id="Image1" runat="server" ImageUrl="Image.ashx?ImageID=12"/>
    

    【讨论】:

    • 非常好,我一定会尝试并回来的。所以基本上像上面一样创建一个“图像页面”,然后使用 *.ashx 页面来请求图像页面?我很抱歉我对asp还很陌生,我习惯了php。感谢您的所有帮助。
    • 我认为你有点倒退:你的 *.ashx 图像页面。您的常规 控件会导致对 *.ashx 页面的请求。另外:我清理了 SG 的代码,以便更好地处理错误的 sql 请求,尽管这仍然很初级。
    • 非常感谢,今晚我会试试的!我对收到回复的速度感到惊讶。非常感谢!
    • 您究竟如何使用处理程序页面。所有这些代码都存在于 ProcessRequest(HttpContext 上下文)函数中吗?
    • 是的,首先我写我的帖子来支持 aspx 页面。如果您更喜欢处理程序,则应将代码放入 ProcessRequest。
    【解决方案2】:

    这里要记住的重要一点是,您不应该尝试与个人资料页面本身一起传输图像数据。相反,您希望您的个人资料页面为浏览器生成如下所示的 HTML 标记:

    <img src="~/MyImageHandler.ashx?UserID=1234" alt="User 1234 avatar" width="100px" height="150px" />
    

    这是您的&lt;asp:Image .../&gt; 控制的最终结果。然后浏览器将发送一个完全独立的 Http 请求来检索图像。这就是网站上的图片的工作方式。然后,您需要能够处理该附加请求。为此,请创建一个Http handler (*.ashx file) 并使用它从数据库中检索适当的图像数据并将其发送到浏览器。

    【讨论】:

    • 好的,您可能碰巧有一个关于如何插入和存储图像的大纲。我知道图像被转换为​​二进制数组......我很确定我可以弄清楚如何插入图像。当谈到检索图像时,我不知道。 *.ashx 文件是如何工作的?
    • 这真的是一个不同的话题:答案将取决于许多未包含在此问题中的内容,例如您的数据库表是如何设置的,表的主键是什么,安全性如何工作,以及如何设置文件上传控制。
    • 如果你真的想要,你可以将这些信息编辑到这个问题中,但是你可能会更多地关注你的问题,因为你在它自己的问题中打开每个问题。
    【解决方案3】:

    如果您使用的是 SQL 2005 或更高版本,则不应使用数据类型 Image,因为它现在是 deprecated。相反,如果可能,您希望使用新的 Varbinary(MAX) 类型。存储它后,您需要做的就是通过 ADO.Net 调用检索它并将单元格值转换为 Byte[] 类型,然后像上面 ScarletGarden 的示例一样调用 Response.BinaryWrite。

    【讨论】:

      【解决方案4】:

      看了几百G的图片后,相信你会发现自己认为操作系统的文件系统和静态文件http服务器比数据库更适合存储图片。它还允许您使用数千种现有的免费工具来处理、移动、托管等图像。

      【讨论】:

        【解决方案5】:

        不要将图像存储在数据库中,而是存储图像的路径和/或文件名。图像将填满数据库并使其变慢。

        【讨论】:

          【解决方案6】:
          protected void Page_Load(object sender, EventArgs e) {
              GridView1.DataSourceID = "";
              GridView1.DataSource = SqlDataSource1;
              GridView1.DataBind();
          }
          
          protected void btnSubmit_Click(object sender, EventArgs e) {
              string strImageName = txtImageName.Text.ToString();
          
              if (FileUpload1.PostedFile != null && FileUpload1.PostedFile.FileName != "") {
                  byte[] imageSize = new byte[FileUpload1.PostedFile.ContentLength];
                  HttpPostedFile uploadedImage = FileUpload1.PostedFile;
                  uploadedImage.InputStream.Read(imageSize, 0, (int)FileUpload1.PostedFile.ContentLength);
          
                  // Create SQL Connection
                  SqlConnection con = new SqlConnection();
                  con.ConnectionString = "Data Source=RND3" + "\\" + "SQLEXPRESS;Initial Catalog=SSSolutionFiles;Integrated Security=True";
          
                  // Create SQL Command 
                  SqlCommand cmd = new SqlCommand();
                  cmd.CommandText = "INSERT INTO Imagess(ImageName,Image)" + " VALUES (@ImageName,@Image)";
                  cmd.CommandType = CommandType.Text;
                  cmd.Connection = con;
          
                  SqlParameter ImageName = new SqlParameter("@ImageName", SqlDbType.VarChar, 50);
                  ImageName.Value = strImageName.ToString();
                  cmd.Parameters.Add(ImageName);
          
                  SqlParameter UploadedImage = new SqlParameter("@Image", SqlDbType.Image, imageSize.Length);
                  UploadedImage.Value = imageSize;
                  cmd.Parameters.Add(UploadedImage);
                  con.Open();
                  cmd.ExecuteNonQuery();
                  con.Close();
          
                  Label1.Text = "File Uploaded";
          
                  GridView1.DataSourceID = "";
                  GridView1.DataSource = SqlDataSource1;
                  GridView1.DataBind();
                  con.Close();
              }
          }
          

          【讨论】:

            【解决方案7】:

            试试这些链接可能对你有帮助..

            您也可以尝试将图像文件存储在服务器上并将路径存储在 Sql 表中.. 通过这些链接

            http://pratikataspdotnet.blogspot.in/2014/11/retrieve-images-from-path-stored-in.html

            【讨论】:

              猜你喜欢
              • 2017-08-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-02-21
              相关资源
              最近更新 更多