比较来自数据库和文件

时间:2018-02-06 18:36:07

标签: c# asp.net

我想将上传的图片与数据库中的所有图片进行比较,如果匹配则应显示带图片的数据,通过将每个图片转换为二进制see this

,比较简单

我正在使用此代码,但它不起作用:

protected void CompareImages(object sender, EventArgs e)
{
    if (this.FileUpload1.HasFile)
    {
        Stream fs = FileUpload1.PostedFile.InputStream;
        BinaryReader br = new BinaryReader(fs);
        Byte[] bytes = br.ReadBytes((Int32)fs.Length);
        string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(constr))
        {
            string sqlQuery = "SELECT * from [MostWanted] WHERE Photo = @FileName";

            using (SqlCommand cmd = new SqlCommand(sqlQuery, conn))
            {
                cmd.Parameters.AddWithValue("@FileName", Path.GetFileName(this.FileUpload1.PostedFile.FileName));
                conn.Open();
                Byte[] bytes2 = (Byte[])cmd.ExecuteScalar();
                conn.Close();
                if (bytes2 != null)
                {
                    if (bytes.Length == bytes2.Length)
                    {
                        ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Equal Images')", true);
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Images are not equal')", true);
                    }
                }
                else
                {
                    ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('File Not found in the table')", true);
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

除非这些图像是同一文件的字面副本,否则简单的二进制比较将不起作用。即使是一点差异或不同的文件格式也会彻底打破它。并且认识到它们的相同之处在于人工智能研究。

如果这些文件与最后一个字节相同,则可以通过为每个图像存储哈希值来加快检查速度。将您尝试添加的图像的哈希值与所有现有图像哈希值进行比较,以预过滤哪些图像哈希值不能相同。您仍然应该进行二进制比较,因为即使使用哈希值,您也可能会出现错误的正数/ colissions(两个不同的输入具有相同的输出)。

由于您还打算存储大量图片,我认为文件流属性可能有所帮助:https://www.simple-talk.com/sql/learn-sql-server/an-introduction-to-sql-server-filestream/

答案 1 :(得分:0)

  • 具有名为data varbinary(max)的列来存储图像文件
  • 查询语句不必具有where条件
  • 删除添加参数行。然后,仅通过比较二进制数据,它就可以完美运行