2017-04-21 74 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/ –