使用Coldfusion从网站下载图像

时间:2017-04-21 14:49:12

标签: html download 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>

当我这样做时,没有错误。但是,当我单击任何图像时,它将转到一个空白页面,其中不显示图像。

我不知道如何将文件名传递给文件名

任何帮助都将不胜感激。

正在显示的错误 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>

1 个答案:

答案 0 :(得分:1)

您使用的是哪种操作系统和网络服务器? (您没有在问题中指出。)如果文件位于可公开访问的路径中,您可以添加规则。我们已将以下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在页面加载后添加属性。