使用Delphi从Amazon下载文件

时间:2016-11-11 03:37:42

标签: delphi amazon-web-services

我正在使用API​​为我提供文件的URL,我希望使用Delphi XE将文件下载到文件或流中。

网址采用以下格式: -

https://xxxxxxx.s3-us-west-2.amazonaws.com/xxx/Reports/414_20160114021919.pdf?AWSAccessKeyId=xxxxxxxxxxxxxx&Expires=1478915858&response-content-disposition=attachment%3Bfilename%3D%22123%20Test%20St%20Dallas__2016_01_14_03_16_00.pdf%22&Signature=xxxxxxxxxxx%3D

我有xxxxxxxxx的敏感安全资料。

如果我将网址粘贴到Chrome中,它会找到该文件并显示保存对话框。

在我的Delphi程序中,我正在使用带有以下代码的URLMon(很高兴地窃听并改编自SO的类似问题的答案): -

function TdmXXXXXXXXX.DownloadFile(AURL, AExtWithDot: string): string;
// returns temp file name or empty string if failed;
var
  sTempFileName: string;
  iError: integer;
begin
  sTempFileName := apmDM.GetTempFileName(AExtWithDot, True);
  iError := UrlDownloadToFile(nil, PChar(AURL), PChar(sTempFileName), 0, nil);
  if iError = S_OK then
    Result := sTempFileName
  else
    Result := '';
  showmessage(SysUtils.IntToHex(iError,8));
end;

showmessage返回“800C000D”

在URLMon中: -

$EXTERNALSYM INET_E_UNKNOWN_PROTOCOL}
INET_E_UNKNOWN_PROTOCOL            = HResult($800C000D);

所以我假设问题与“?”之后的内容有关。在URL中,“AWSAccessKeyId =”等。

不知道从哪里开始 - 在这里和谷歌先生一起搜索......

干杯 杰夫

2 个答案:

答案 0 :(得分:0)

虽然您通常会找到指向Indy TIdHTTP组件的指针,但我个人最喜欢的是包含Microsoft XML库(MSXML2_TLB)和使用XmlHTTPRequest组件。如果您在其响应流属性上使用TStreamAdapter,则您将通过URL获得资源流。

答案 1 :(得分:0)

我抓了所有我做过的事,然后从头开始重新开始。

这一切都使用URLMon和 URLDownloadToFile(nil, PChar(sReportURL), PChar(sTempFileName), 0, nil);

我仔细研究了代码,看不出报告的问题代码和最终代码之间的区别。