我正在使用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 =”等。
不知道从哪里开始 - 在这里和谷歌先生一起搜索......
干杯 杰夫
答案 0 :(得分:0)
虽然您通常会找到指向Indy TIdHTTP组件的指针,但我个人最喜欢的是包含Microsoft XML库(MSXML2_TLB)和使用XmlHTTPRequest组件。如果您在其响应流属性上使用TStreamAdapter,则您将通过URL获得资源流。
答案 1 :(得分:0)
我抓了所有我做过的事,然后从头开始重新开始。
这一切都使用URLMon和
URLDownloadToFile(nil, PChar(sReportURL), PChar(sTempFileName), 0, nil);
我仔细研究了代码,看不出报告的问题代码和最终代码之间的区别。