如何为通用HTTP请求的响应文件指定唯一名称?

Jer*_*dge 1 delphi http indy indy10 delphi-xe2

我开发了一个HTTP API服务器(打算由第三方应用程序调用,不一定是通过Web浏览器调用),它get通过name在查询字符串中传递参数来对(下载)任何和所有类型的文件进行一次通用调用请求的文件.所有调用,无论哪个文件,都在我的同一个自定义请求处理程序中处理Get(不要与标准HTTP混淆get).查询字符串包含name标识要获取的唯一文件的属性.

所以请求可能如下所示:

http://MyServerURL.com/Get?Key=SomeAPIKeyForAuthentication&Name=SomeUniqueIdentifier
Run Code Online (Sandbox Code Playgroud)

首先,我知道我显然可以让服务器仅使用URI来获取文件,例如......

http://MyServerURL.com/SomeUniqueIdentifier?Key=SomeAPIKeyForAuthentication
Run Code Online (Sandbox Code Playgroud)

...但设计专门用于使用这一个通用get命令,因此我需要在查询字符串中保留此唯一标识符.连接到此API的实际应用程序永远不需要知道此文件名,但是当手动提供URL以便某人在其浏览器中打开以下载文件时,可能会发生一个事件.

但是,无论何时通过Web浏览器下载文件,由于调用是get,所以保存的文件名也会随之而来get.

我可以在我的服务器上实现HTTP中的任何技巧,这会强制下载的文件名是唯一的标识符,而不仅仅是get?例如,某些方法如使用重定向?

TIdHTTPWebBrokerBridge在Delphi XE2中使用Indy 10 作为Web服务器.当我TWebModule处理这个get请求时,我正在寻找这个组件中的一种方法(技术上在它的相应处理程序中),使响应的文件名成为我想要的任何字符串(在本例中SomeUniqueIdentifier).我听过"URL重写"一词,但这是一个相当不同的话题,并不认为这是我需要的,但它可能会.

sym*_*ean 7

这似乎是一种相当漫长的说法,你想要为HTTP下载设置文件名,而不依赖于用于获取它的URL.在这种情况下,您只需发送一个Content-Dispositon标头,指定所需的文件名.见rfc 2616第19.5.1节

例如

 Content-Disposition: attachment; filename="stackoverlow.ans"
Run Code Online (Sandbox Code Playgroud)

  • 如果正在下载的文件是物理文件,您可以使用`TIdHTTPResponseInfo.ServeFile()`将文件发送到客户端,`ServeFile()`将为您填写`Content-Disposition`标题.否则,您可以手动填写`TIdHTTPResponseInfo.ContentDisposition`属性:`AResponseInfo.ContentDisposition:= Format('attachment; filename ="%s";',[TheDesiredFileNameHere]);` (2认同)