2017-04-21 75 views
0

我對ColdFusion相當陌生。我有下面的代碼,它顯示在我可以正常工作的教程中引用的頁面上的圖像。從網站下載圖片使用Coldfusion

當用戶選擇任何圖像時,它將在瀏覽器中顯示圖像。但是,我想讓用戶下載圖像,而不是在瀏覽器中顯示它們。

我無法使用HTML5 下載來實現我正在做的事情,因爲我正在使用的網站在XHTML 1.0上運行。

我發現了以下方法File Downloads with ColdFusion但我不理解如何應用它。如果任何人都可以引導我走向正確的方向,或向我展示另一種方法,我將不勝感激。

謝謝您提前。

<cfset filters = "*.pdf|*.zip|*.doc*|*.docx*|.ppt*|*.pps*|*.pot*|*.dot*|*.xls*|*.xlsx*|*.swf|*.rtf|*.png|*.bmp|*.jpeg|*.gif"> 
<cfdirectory 
    directory="c:\Downloads\Logos" 
    name="myDirectory" 
    action = "list" 
    filter="#filters#" 
    sort="name ASC, size DESC" 
    > 
<table width="80%" border="0" align="left"> 
    <cfoutput query="myDirectory"> 
     <cfset FileExt=ListLast(Name,".")> 
     <cfif FileExt eq 'pdf'> 
      <cfset imgicon = 'pdf-icon-24.png'> 
      <cfelseif FileExt eq 'xlsx' or FileExt eq 'xls'> 
      <cfset imgicon = 'Microsoft-Excel-icon-24.png'> 
      <cfelseif FileExt eq 'docx' or FileExt eq 'doc'> 
      <cfset imgicon = 'docx-icon-24.png'> 
      <cfelseif FileExt eq 'lnk'> 
      <cfset imgicon = 'url-icon-24.png'> 
      <cfelseif FileExt eq 'png'> 
      <cfset imgicon = 'png-icon.png'> 
      <cfelse> 
      <cfset imgicon = 'Documents-icon-24.png'> 
     </cfif> 
     <tr> 
      <td width="30">&nbsp;</td> 
      <td class="e"><img src="images/#imgicon#" alt="#Name#" class="float-left"/ ></td> 
      <td class="e"> <a href="ForceDownload.cfm?filename=#EncodeForURL(Name)#">#Name#</a></td> 
     </tr> 
    </cfoutput> 
</table> 
</p> 
<br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br />  
<p class="post-footer align-left"> 
    <span class="date"> 
     <cfoutput>#dateformat(Now(),"mmm dd,yyyy")#</cfoutput> 
    </span> 
</p> 
<br /> 
<br />  
</div> 

更新我創造了另一個腳本,並把它稱爲ForceDownload.cfm,也做了以下內容:

<cfset folder = "c:\path\Downloads\Logos\"> 
<cfif StructKeyExists(url,"filename") && fileExists(folder & filename)> 
    <cfset filename = href="ForceDownload.cfm?filename=#Name#"> 
    <cfset fileInfo = GetFileInfo(folder & filename)> 
    <cfset mimeType = getPageContext().getServletContext().getMimeType(folder & filename)> 
    <cfheader name="Content-Disposition" value="attachment; filename=""#filename#"""> 
    <cfheader name="Expires" value="#Now()#"> 
    <cfheader name="Content-Length" value="#fileInfo.size#"> 
    <cfcontent type="#mimeType#" file="#folder##filename#" deletefile="No"> 
</cfif> 

我更換了以下標籤<a href="Logos\#Name#" >#Name#</a>具有以下標籤<a href="ForceDownload.cfm">#Name#</a>

當我這樣做,沒有錯誤。但是,當我點擊任何圖像時,它會進入不顯示圖像的空白頁面。

我不知道如何傳遞文件的名稱爲filename

任何幫助,將不勝感激。

正在顯示 enter image description here

更新的錯誤:

我更新的超級鏈接:<a href="ForceDownload.cfm:filename=#Name#">#Name#</a></td>

,我做了以下內容:*

<cfparam name="http://portal/regalnet_test/ForceDownload.cfm?filename=#Name#" default=""> 
<cfset folder = "\\oc2-web\wwwroot\RegalNet_Test\Downloads\MktgDownloads\Logos\"> 

<!--- If the path to the file is valid ---> 
<cfif fileExists(folder & filename)> 
    <cfset filename = name> 
    <cfset fileInfo = GetFileInfo(folder & filename)> 
    <cfset mimeType = getPageContext().getServletContext().getMimeType(folder & filename)> 
    <cfheader name="Content-Disposition" value="attachment; filename=""#filename#"""> 
    <cfheader name="Expires" value="#Now()#"> 
    <cfheader name="Content-Length" value="#fileInfo.size#"> 
    <cfcontent type="#mimeType#" file="#folder##filename#" deletefile="No"> 

<!--- Otherwise, display debugging information (Dev only) ---> 
<cfelse> 
    <cfoutput> 
    Sorry, unable to find file: #folder##filename#<br> 
     Does the folder exist? #directoryExists(folder)#<br> 
    Does the File Exist? = #fileExists(folder & filename)# 
    </cfoutput> 
</cfif> 
+0

您需要額外的.cfm腳本來處理下載。該新腳本將包含來自博客條目的代碼(請務必更新文件夾路徑)。然後創建一個指向新腳本的超鏈接,並將該圖像文件名稱作爲名爲「文件名」的URL參數傳遞。 – Leigh

+0

@Leigh你能告訴我嗎?再一次,我對此很新穎。 –

+0

先試一試:) 1.將該確切代碼複製到新的.cfm文件中。 2.將文本「[文件路徑下載]」更改爲真正的文件路徑,如「c:\ path \ yourimages \」3.現在,在瀏覽器中通過傳遞真實圖像的文件名來測試該腳本目錄作爲名爲'filename'的URL參數。例如'http://yoursite/yourNewPage.cfm?filename = someImageFileThatExists.png'。結果是什麼? – Leigh

回答

1

哪OPE評分系統和網絡服務器您使用? (你沒有在你的問題中指出。)如果這些文件在公共可訪問的路徑中,你可以添加一條規則。我們已將以下IIS web.config文件添加到託管可用於「僅下載」的高分辨率圖像的子目錄中。我們更喜歡這種方法,而不是使用有價值的ColdFusion線程來緩慢或濫用(即DoS)請求傳遞靜態文件。 (我們遇到了一些機器人,他們反覆請求這樣的靜態文件,然後在確定它是文件後中止下載。此時,ColdFusion已經爲時已晚,因爲它已經將整個文件加載到RAM中,遇到配送錯誤,中止,並記錄錯誤)

注:我們只使用CFContent當內容或者是個人&密碼保護或尚未位於公衆可訪問的網絡路徑。

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpProtocol> 
      <customHeaders> 
       <add name="Content-disposition" value="Attachment" /> 
      </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
</configuration> 

關於HTML5 download屬性,某些瀏覽器可能仍將信守即使DOCTYPE未正確使用HTML5的屬性。如果您擔心驗證服務,則可以使用javascript在頁面加載後添加屬性。

+0

有效點。老實說,我只是假設這是一個學習練習。 – Leigh

+0

問題是如何在沒有HTML5的AHREF「下載」屬性的情況下強制下載。雖然使用ColdFusion可能會做到這一點,但不推薦使用它,並且會對整個ColdFusion環境產生負面影響......尤其是在搜索索引機器人開始跟蹤具有多個同時請求的鏈接之後。 –

+0

這是我推薦向ColdFusion添加「XSendFile」支持的原因之一......因此,受保護的非公共路徑中的文件可以使用Web服務器而不是ColdFusion提供給最終客戶。這在2011年被問到,但我認爲不存在簡單/本地解決方案。 http://stackoverflow.com/questions/8652981/how-to-prevent-external-users-from-viewing-document-files/ –