使用INDY检测远程服务器上文件的Mime-Type

kat*_*sen 4 delphi indy mime-types

我一直在使用Synapse库从互联网上下载文件,但我最近将我的应用程序转换为使用INDY而我错过了Synapse库中的一个更好的功能,即能够轻松获取Mime类型的在将文件保存到本地计算机之前从服务器下载的文件.INDY是否具有此功能,如果有,我该如何访问它?

kob*_*bik 8

您可以发出HTTP HEAD请求并检查Content-Type标头.在你真正GET的文件(下载)之前:

procedure TForm1.Button1Click(Sender: TObject);
var
  Url: string;
  Http: TIdHTTP;
begin
  Url := 'http://yoursite.com/yourfile.png';
  Http := TIdHTTP.Create(nil);
  try
    Http.Head(Url);
    ShowMessage(Http.Response.ContentType); // "image/png"
  finally
    Http.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

ContentType您收到回依赖于Web服务器实现,并不能保证在每个服务器相同.


另一个选项是实际上GET是文件,并将其内容保存到内存流,例如TMemoryStream(不是本地文件).Indy提供了一个过载:

Http.Get(Url, AStream);
Run Code Online (Sandbox Code Playgroud)

然后检查Http.Response.ContentType,并将流保存到文件:AStream.SaveToFile.


不确定这里的相关性,但请注意Indy也可以返回/猜测本地文件的mime类型(给定文件扩展名).与GetMIMETypeFromFile(使用IdGlobalProtocols).另见这里.

  • "这似乎是一种倒退的方式......":我从未使用过Synapse.您可以编辑您的问题并发布您使用Synapse的代码,我可能会尝试猜测它是如何完成的(我也相信源代码可用).我所知道的是,任何HTTP客户端(Idny/Synapse/other)都需要请求HEAD - 它不会下载服务器内容,或GET - 它将首先下载内容(或将其流式传输到内存).看我的编辑. (2认同)