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