Автор Тема: Как в MySQL 5.5 вставить картинку ? [решено]  (Прочитано 1482 раз)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Всем привет!

Нужно в БД вставить картинку, не получается.

Делаю так:
INSERT INTO table_name (photo) VALUES (LOAD_FILE('/tmp/photo.jpg'))
Поле photo -- это BLOB поле, точнее LONGBLOB.

Кто может подсказать как всё же вставить фотку ?

Заранее спасибо.
« Последнее редактирование: 27.01.2015 17:22:45 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: Как в MySQL 5.5 вставить картинку ?
« Ответ #1 : 27.01.2015 08:07:50 »
Погуглил, наиболее развёрнуто (в том числе комментарии):
http://blog.webmasterschool.ru/php/109/

Как я понял, надо любым способом избавиться от специальных символов в содержимом картинки.

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Re: Как в MySQL 5.5 вставить картинку ?
« Ответ #2 : 27.01.2015 10:30:44 »
Чё т всё равно непонятно...

Какие мне спец символы убирать ?
Мне вообще в Lazarus нужно.
Но, начнём с консоли :)
Я делаю:
mysql -u root -p
USE test;
INSERT INTO image (photo) VALUES (LOAD_FILE('/tmp/photo.jpg'));
и получаю NULL.
Сноси Винду, переходи на Линукс ! :)

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 926
    • Домашняя страница
    • Email
Re: Как в MySQL 5.5 вставить картинку ?
« Ответ #3 : 27.01.2015 11:15:30 »
Чё т всё равно непонятно...

Какие мне спец символы убирать ?
Мне вообще в Lazarus нужно.
Но, начнём с консоли :)
Я делаю:
mysql -u root -p
USE test;
INSERT INTO image (photo) VALUES (LOAD_FILE('/tmp/photo.jpg'));
и получаю NULL.
Всё верно. Потому что путь указываете в реальной системе, а MySQL запущен в chroot (/var/lib/mysql), где этого файла нет.
Программно (а не в консольном клиенте) BLOB, скорее всего поместится.
Андрей Черепанов (cas@)

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 926
    • Домашняя страница
    • Email
Re: Как в MySQL 5.5 вставить картинку ?
« Ответ #4 : 27.01.2015 11:16:58 »
BLOB and MySQL в форуме Lazarus, http://lists.lazarus.freepascal.org/pipermail/lazarus/2012-May/073868.html в рассылках.

       conn := getConnection(_TypeConnection);
       query.DataBase := conn;
       query.UsePrimaryKeyAsKey:=false;

       query.SQL.clear;
       query.SQL.Add('update volumepage set page_image = :image, 
image_filename = :imgname where volume_id = :vol and page_index = :page');
       query.Params.ParamByName('vol').Value:=pVolumeId;
       query.Params.ParamByName('page').Value:=pPageIndex;
       query.Params.ParamByName('image').LoadFromFile(pFileName,ftBlob);
       query.Params.ParamByName('imgname').Value:=pFileName;

       query.ExecSQL;
Андрей Черепанов (cas@)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Re: Как в MySQL 5.5 вставить картинку ?
« Ответ #5 : 27.01.2015 12:56:20 »
ftBlob
На это ругается.

Ммм...
В общем у меня так выходит, но ничего не выходит:
with SQLQuery1 do
begin
  Close;
  SQL.Clear;
  SQL.Add('UPDATE image SET scan = :photo');
  Params.ParamByName('photo').LoadFromFile('/tmp/scan.jpg', ftBlob);
  ExecSQL;
end;

О, через DBImage+Append/Insert/Post вроде бы заработало!

Но всё же через запрос было бы просто шикарно наладить...
« Последнее редактирование: 27.01.2015 12:59:48 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Re: Как в MySQL 5.5 вставить картинку ?
« Ответ #6 : 27.01.2015 17:22:29 »
Мне улыбнулась удача!

Использовал информацию отсюда:
https://freepascalanswers.wordpress.com/2012/02/22/upload-files-into-database/
http://stackoverflow.com/questions/4201210/how-to-save-a-jpeg-image-to-mysql-and-retrieve-it-later

На добавление:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    with SQLQuery1 do begin
      SQL.Text:= 'INSERT INTO image (scan) VALUES (:content)';
      ParamByName('content').LoadFromFile(OpenPictureDialog1.FileName, ftBlob);
      ExecSQL;
    end;
  end;
end;
На выгрузку (просмотр):
procedure TForm1.Button2Click(Sender: TObject);
var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    TBlobField(SQLQuery1.FieldByName('scan')).SaveToStream(AStream);
    AStream.Position := 0;
    Image1.Picture.LoadFromStream(AStream);
  finally
    AStream.Free;
  end;
end;
« Последнее редактирование: 27.01.2015 17:24:07 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)