Загрузка изображения непосредственно через mySQL Command Line

У меня есть определенная таблица в mySQL, которая имеет поле под названием "образ" с типом данных "BLOB". Мне было интересно, можно ли загружать изображение в это поле непосредственно из клиента командной строки, а не делать это через php... Если это возможно, то где именно я должен разместить свои файлы изображений?

Ответы

Ответ 1

Попробуйте использовать функцию LOAD_FILE().

UPDATE `certain_table`
SET image = LOAD_FILE('/full/path/to/new/image.jpg')
WHERE id = 1234;

См. руководство по требованиям к пути к имени файла, привилегии и т.д.

Ответ 2

Я рекомендую вам никогда не загружать изображения непосредственно в базу данных, это довольно неэффективно. Лучше просто сохранить местоположение и имя изображения и сохранить эти изображения в папке где-нибудь.

и если вы хотите "загрузить" через командную строку, вы можете просто выполнить:

insert into table(image_loc) values('/images/random/cool.jpg') where id=1;

и в зависимости от вашей среды вы можете использовать доступ к оболочке для перемещения изображений вокруг. Я не совсем уверен, что вы пытаетесь сделать с этими изображениями или как ваша система настроена. Вероятно, вам придется пояснить это.

Ответ 3

LOAD_FILE работает только с определенными привилегиями и если файл находится на сервере. Я нашел способ сделать его полностью клиентской стороной:

mysql -e "update mytable set image=FROM_BASE64('`base64 -i image.png`')" DBNAME

Идея состоит в том, чтобы закодировать изображение на base64 на лету и позволить затем MySql его декодировать.

Ответ 4

Это вариант ответа Teudimundo, который работает со старыми версиями MySQL, где функции Base64 недоступны:

mysql -e "update mytable set col = x'$(xxd -p image.png | tr -d \\n)' where ..."

Хитрость заключается в использовании xxd -p для преобразования двоичного файла в простой hexdump:

$ xxd -p /usr/share/font-manager/data/blank.png
89504e470d0a1a0a0000000d4948445200000040000000400806000000aa
6971de000000274944415478daedc1010d000000c220fba77e0e37600000
00000000000000000000000000c0bd0040400001ee1dbb2f000000004945
4e44ae426082

затем используя tr -d \\n, чтобы удалить новые строки и, наконец, введем результат в строковый литерал с шестнадцатеричным значением MySQL: x'...'

Ответ 5

Более предпочтительно создавать пример приложения, а затем вставлять значения в базу данных. Например, этот метод можно использовать для ввода типа данных BLOB в базу данных...

[WebMethod]
                public string sendDataToMySql(string get_name, byte[] buffer)
                {
                    string MyConString = "SERVER=localhost;" +
                          "DATABASE=test;" +
                          "UID=root;" +
                          "PASSWORD=admin;";


                    MySqlConnection connection = new MySqlConnection(MyConString);
                    connection.Open();
                    MySqlCommand command = new MySqlCommand("", connection);
                    command.CommandText = "insert into testImage(name, image) values(@name, @image);";


                    MySqlParameter oParam1 = command.Parameters.Add("@name", MySqlDbType.VarChar, 50);
                    oParam1.Value = get_name;


                    MySqlParameter oParam2 = command.Parameters.Add("@image", MySqlDbType.Blob);
                    oParam2.Value = buffer;

                    command.ExecuteNonQuery();

                    connection.Close();
                    return "Data was inserted successfully!";
                   }

Ответ 6

Иногда мы пытаемся загрузить файл с помощью загрузочного файла, но файл не загружен или путь к файлу в форматированном тексте сохраняется в поле BLOB. Это связано с проблемами доступа. Если вы столкнулись с таким условием, вместо того, чтобы загружать файл из любого места, попробуйте загрузить его из пути данных mysql, предпочтительно, как:

INSERT INTO `srms`.`images` (`ID`, `Image`) VALUES ('5', load_file('C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\test.jpg'));