>我使用一个需要登录的网站,并一度使用 http 显示一个 jpg
<img src="https://www.theurl.com/pictures/Photo.ashx?theid=221">
我想使用 Delphi 下载此图像(以及使用其他参数的其他图像)并将其存储在 SQLite 数据库中。
我能够从我的HDD中获取jpg文件并将其存储在数据库中。
procedure TForm1.Button1Click(Sender: TObject); //this works
begin
DISQLite3Database1.DatabaseName := 'C:testphoto.db';
DISQLite3Database1.Open;
try
Query1.Close;
Query1.selectSQL := ('insert into StudentPhotos(id,photo)
values(''sally'', :photo)');
Query1.Params.ParamByName('photo').LoadFromFile
('C:UsersAdminDocumentstestpic2.jpg',ftGraphic);
Query1.Open ;
finally
DISQLite3Database1.close;
end;
end;
我还能够使用以下方法将图像从网站下载到文件中(在运行处理登录的代码后)
procedure TForm1.Button2Click(Sender: TObject);
var
Strm: TMemoryStream;
HTTP: TIdHTTP;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
try
http:= TIdHTTP.create; //make an http component
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Strm := TMemoryStream.Create;
HTTP.IOHandler:=LHandler;
HTTP.HandleRedirects := true;
HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'; try
Http.Get('https://www.TheUrl.com/picures/Photo.ashx?theid=221' , Strm);
Strm.Position := 0;
Strm.SaveToFile('C:UsersAdminDocumentstestpic2.jpg');
except
on e:Exception do
begin
ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
showmessage('could not download file');
end;
end;
finally
http.Free;
LHandler.Free ;
Strm.free;
end;
end;
但是,我不希望将每个文件保存在客户端硬盘驱动器上,然后将其读回以将其保存到数据库中,因为这会很慢。
问题
将上述两个过程结合起来以便我可以下载到流中,然后将流直接传递到查询参数中以准备将其保存在数据库中的正确语法是什么?
注意我使用的是 DISQLIte3,但查询方法/属性与其他组件类似。
大多数具有 LoadFromFile 的类也具有 LoadFromStream。你试过吗?
即。
Query1.Params.ParamByName('photo').LoadFromStream(Strm,ftGraphic);
Joe Meyer - 是的,我看到了那个链接,它与数据库没有任何关系。就像我在过去两天看到的大多数事情一样,它只处理进出图像的斑点
@bummi & HeartWare我尝试了大量不同的组合...ParamByName('photo')。LoadFromStream()...使用Tfilestream和TmemoryStream,但不断出现不兼容的类型错误,可能是因为我不知道在处理jpg而不是位图时使用什么TBlobType。
我完全复制了您建议的内容到我的第一个程序中以获得
begin
DISQLite3Database1.DatabaseName := 'C:UsersAdminDocumentsRAD StudioProjectssqlite with photostestphoto.db';
DISQLite3Database1.Open;
try
strm := TmemoryStream.Create;
strm.LoadFromFile('C:UsersAdminDocumentsRAD StudioProjectssqlite with photostestpic2.jpg');
Query1.Close;
Query1.selectSQL := ('insert into StudentPhotos(id,photo) values(''sally'', :photo)');
Query1.Params.ParamByName('photo').LoadFromStream(Strm,ftGraphic);
Query1.Open ;
finally
strm.Free ;
DISQLite3Database1.close;
end;
end;
。而且第一次就奏效了!
我想有时在开发时,人们看不到树木的木材。我现在应该可以解决剩下的了,谢谢你们俩