我开发了一个HTTP API服务器(打算由第三方应用程序调用,不一定是通过Web浏览器调用),它通过get
(下载)任意和所有类型的文件进行一次通用调用在请求的文件的查询字符串中传递name
参数。所有调用,无论哪个文件,都在我的同一个自定义请求处理程序Get
中处理(不要与标准HTTP get
混淆)。查询字符串包含属性name
,用于标识要获取的唯一文件。
所以请求可能如下:
http://MyServerURL.com/Get?Key=SomeAPIKeyForAuthentication&Name=SomeUniqueIdentifier
首先,我知道我显然可以让服务器仅使用URI来获取文件,例如......
http://MyServerURL.com/SomeUniqueIdentifier?Key=SomeAPIKeyForAuthentication
...但该设计专门用于使用这一个通用get
命令,因此我需要在查询字符串中保留此唯一标识符。连接到此API的实际应用程序永远不需要知道此文件名,但是当手动提供URL以便某人在其浏览器中打开以下载文件时,可能会发生一个事件。
但是,每当通过网络浏览器下载文件时,由于通话为get
,因此保存的文件名最后只会为get
。
HTTP中是否有任何技巧可以在我的服务器上实现,这会强制下载的文件名成为唯一标识符,而不仅仅是get
?例如,某些方法如使用重定向?
我在Delphi XE2中使用Indy 10 TIdHTTPWebBrokerBridge
作为Web服务器。当我处理这个TWebModule
请求时,我正在寻找这个组件中的方法(技术上在其相应的get
处理程序中),以使响应的文件名成为我想要的任何字符串(在这种情况下,{{1 }})。我听过“URL重写”一词,但这是一个相当不同的主题,并且不认为这是我需要的,但它可能会。
答案 0 :(得分:7)
这似乎是一种相当漫长的说法,你想要为HTTP下载设置文件名,而不依赖于用于获取它的URL。在这种情况下,您只需发送一个Content-Dispositon标头,指定所需的文件名。见section 19.5.1 of rfc 2616
e.g。
Content-Disposition: attachment; filename="stackoverlow.ans"