Сохранить изображение в MySQL через приложение C # - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть клиентское приложение на C #, которое предназначено для размещения в месте изображения (DataType: VarChar). Затем это приложение должно вызывать веб-сервис, который, в свою очередь, будет хранить изображение (НЕ местоположение) в локальной базе данных 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!";

        }

Ответы [ 3 ]

4 голосов
/ 14 декабря 2011

Я не думаю, что вам вообще нужно объявлять переменную buffer_new, вы можете просто использовать параметр buffer как есть.

Я предполагаю, что вам следует присвоить MySql.Data.MySqlClient.MySqlDbType.Blobтип данных для параметра @Image, а не просто AddWithValue ...

, проверьте полный пример: Вставьте BLOB-объект в MySQL

1 голос
/ 13 марта 2013

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("-", "");

        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();

        con.Close();
0 голосов
/ 14 декабря 2011
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;
    }           
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...