Мне нужно прочитать изображение JPG, хранящееся в XML-файле, и вставить его в поле blob в базе данных SQLite.SQLite - Как вставить изображение в формате JPG из файла XML (используя Delphi 2009)
Я могу сделать части этого уже, как показано ниже в коде, но нам нужна помощь по его объединению. Может кто-нибудь, пожалуйста, покажите мне, как прочитать текстовый файл bitmap в файле XML и вставить его в поле blob в базе данных?
Это то, что я уже могу сделать.
Я могу прочитать файл XML с помощью Дельх данных XML блока и хранения текстового материала Binding из него в базе данных, используя следующий (упрощенный) код:
procedure TForm1.BtnReadXML(Sender: TObject);
var
sql : string;
Data : XML_Binding_Photos.IXMLSuperStarReportType;
RecNum : integer;
begin
Data := XML_Binding_Photos.LoadSuperStarReport ('Photos.xml');
Database1.Open;
try
RecNum := 2;
SQL := 'INSERT INTO main.Photos (id , firstname) VALUES (Data.record_[RecNum].ID, Data.record_[RecNum].Fname) ;' ;
Query1.Close;
Query1.selectSQL := sql; //insert the data
Query1.Open ;
finally
Database1.Close;
end;
end;
Я также могу вставить JPG изображение с диска в базу данных, используя потоки, как это:
procedure TForm1.Insert_JPG_PhotoFromFile(Sender: TObject);
var
strm : TmemoryStream ;
begin
Database1.Open;
strm := TmemoryStream.Create;
try
strm.LoadFromFile('C:\...\testpic2.jpg');
Query1.Close;
Query1.selectSQL := ('INSERT INTO main.Photos (id, photo) VALUES (''999'', :photo)');
Query1.Params.ParamByName('photo').LoadFromStream(Strm,ftGraphic);
Query1.Open ;
finally
strm.Free ;
DISQLite3Database1.close;
end;
end;
Но мой файл XML имеет JPG изображение в нем, кодируется следующим образом:
<Record>
<ID>14046</ID>
<Fname>Fred</Fname>
<Photo>/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAE - lots more of the same - txNxvd8dc44Htz/Ktx3Oe3T/AB96KK6DA//Z </Photo>
</Record>
Я могу прочитать символы, составляющие растровое изображение, в строку или StringStream, используя блок привязки данных XML, но, похоже, не может корректно его сохранить в виде блоба в базе данных.
(Я не хочу сначала сохранять каждый образ XML на диск как jpg, частично как его уже на диске в другой форме, а частично - тысячи этих изображений в XML-файле. Также для других причины, я хочу поместить изображение в базу данных, а не поместить его на диск и просто сохранить имя файла)
Вы знаете, как получить поток из файл и как сохранить поток в db. Таким образом, ваш реальный вопрос может быть сведен к: Как получить данные изображения из xml в поток. Может быть, этот реальный вопрос приведет вас к ответу: o) –
После большего количества исследований данные, вероятно, будут закодированы в base64 и, возможно, jpg не bmp. Я использовал компонент Indy TIdDecoderMIME, то есть PhotoData: = IdDecoderMIME1.DecodeString (PhotoData); а затем посмотрел на результат в шестнадцатеричном формате, и он начинается с FFD8, который, как я понимаю, означает, что это jpg. Поэтому я попытался создать поток, используя TheStream.Write (PhotoData [1], Length (PhotoData)); а затем Query1.Params.ParamByName ('the_photo'). LoadFromStream (TheStream, ftGraphic); но я все еще не получаю нужного изображения в базе данных (там есть изображение, но его только цветные квадраты и странные символы – user3209752
Строка Base64 - это закодированный поток. Просто найдите строку base64 для потокового декодера; o) –