2016-11-11 85 views
1

我與爲我提供了一個文件的URL的API時,我想下載到文件或用Delphi XE流的文件。下載從Amazon文件用Delphi

網址是這種形式: -

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'ed了敏感的安全的東西。

如果我將URL粘貼到瀏覽器,找到文件,並提出了保存對話框。

在我的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

被稱爲查詢字符串。在深入這種編程之前,瞭解這個簡單的術語是至關重要的。你使用的是什麼版本的Delphi?如果我記得,後來的版本帶有一個用於連接到S3的內置組件。 –

+0

看看這個問題。使用Delphi的雲組件可以更容易地訪問Amazon S3。 http://stackoverflow.com/questions/40243529/upload-files-to-amazon-s3-with-delphi-using-temporary-security-credentials/40269435#40269435 –

+0

我認爲它有一些東西做的東西之前的「:」(「https」),因爲*這是協議。也許你需要做一些特殊的事情來實現安全的連接。它可能與亞馬遜無關。 (您可以通過嘗試使用其他一些https URL而不是亞馬遜網址來確認您的代碼。) –

回答

0

雖然你通常會發現指針Indy TIdHTTP組件,我個人最喜歡的是包含Microsoft XML庫(MSXML2_TLB),並使用XmlHTTPRequest組件。如果你對它的responseStream屬性使用TStreamAdapter,你將有一個通過URL訪問資源的流。

0

我試圖解決這個問題,好幾個小時,終於刻在我做了,並從頭開始重新啓動所有。它使用URLMon和 URLDownloadToFile(無,PChar(sReportURL),PChar(sTempFileName),0,無);

我都看了又看代碼並不能看到報告的問題代碼和我最後的代碼之間的任何差別。

抱歉佔用您的集體時間。謝謝傑夫。 「之後的東西?」