通过C#应用程序将图像保存在MySQL中

本文关键字:存在 MySQL 保存 图像 应用程序 通过 | 更新日期: 2023-09-27 18:17:39

我有一个 C# 客户端应用程序,旨在获取图像(DataType: VarChar)的位置。然后,该应用程序应该调用Web服务,该服务又会将图像(而不是位置(存储在本地MySQL数据库中。

问题是,我意识到我能够将所有其他数据从表单传递到数据库,除了图像......谁能指出我在这里做错了什么?任何帮助将不胜感激。

ps - 我知道你们中的很多人会建议我将图像保存在文件系统中而不是数据库本身......但问题是,无论如何,我的数据库并没有那么大,所以将图像保存在数据库本身上并不是什么大问题,希望:)

这是我在 MySQL 中的表格,

create table testImage(
id int not null auto_increment,
name varchar(50),
age int,
image blob,
primary key(id));

这是旨在将数据插入表中的WebMethod...当image字段被注释掉时,它有效。

[WebMethod]
        public string sendDataToMySql(string get_name, int get_age, byte[] buffer)
        {
            string MyConString = "SERVER=localhost;" +
                  "DATABASE=test;" +
                  "UID=root;" +
                  "PASSWORD=password;";
            string name_new = get_name;
            int age_new = get_age;
            byte[] buffer_new = buffer;

            MySqlConnection connection = new MySqlConnection(MyConString);
            connection.Open();
            MySqlCommand command = new MySqlCommand("", connection);
            command.CommandText = "insert into testdata(name, age, image) values(@name, @age, @image);";
            command.Parameters.AddWithValue("@name", name_new);
            command.Parameters.AddWithValue("@age", age_new);
            command.Parameters.AddWithValue("@image", buffer_new);
            command.ExecuteNonQuery();
            connection.Close();
            return "Task Performed!";
        }

通过C#应用程序将图像保存在MySQL中

我认为您根本不需要声明buffer_new变量,您可以按原样使用 buffer 参数。

我的猜测是,您应该将MySql.Data.MySqlClient.MySqlDbType.Blob数据类型分配给@Image参数,而不仅仅是AddWithValue...

查看此处的完整示例:将 blob 插入 MySQL

Blob 是一个十六进制值

http://dev.mysql.com/doc/refman/5.0/en/hexadecimal-literals.html

一种方法是在插入查询中将字节数组传递给十六进制字符串,而无需使用 Parameters.Add ("@ Fileimage" MySqlDbType.MediumBlob(;

MySqlConnection con = new MySqlConnection("Server=localhost;Database=bd_prueba;Uid=root;Pwd=Intel-IT;");
FileStream fs = new FileStream(@"D:'proyectos2.jpg", FileMode.Open, FileAccess.Read);
byte[] rawData = new byte[fs.Length];        
fs.Read(rawData, 0, (int)fs.Length);
fs.Close();
//byte[] to HEX STRING
string hex = BitConverter.ToString(rawData);
//'F3-F5-01-A3' to 'F3F501A3'
hex = hex.Replace("-", "");
if(con.State == con.Closed)
{
    con.Open();
}
//Standart VALUE HEX x'F3F501A3'
string SQL = @"INSERT INTO tabla(id,fileimage) VALUES ('stringhex',x'"+hex+"')";
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;            
cmd.CommandText = SQL;
cmd.ExecuteNonQuery();
if(con.State == con.Open)
{
    con.Close();
}
System.IO.BufferedStream bf = new BufferedStream(httpFile.InputStream);
byte[] buffer = new byte[bf.Length];   
bf.Read(buffer,0,buffer.Length);    

然后将缓冲区传入输入语句。 数据类型需要为 BLOB 才能处理它。您还需要获取 mime 类型,并有一个过滤器来过滤您想要支持的 mime 类型,否则您可能会对数据库中的内容遇到各种麻烦。

private string getFileExtension(string mimetype)
{
    mimetype = mimetype.Split('/')[1].ToLower();
    Hashtable hTable = new Hashtable();
    hTable.Add("pjpeg","jpg");
    hTable.Add("jpeg","jpg");
    hTable.Add("gif","gif");
    hTable.Add("x-png","png");
    hTable.Add("bmp","bmp");
    if(hTable.Contains(mimetype))
    {
        return (string)hTable[mimetype];
    }
    else
    {
        return null;
    }           
}