我对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"> </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>
当我这样做时,没有错误。但是,当我单击任何图像时,它将转到一个空白页面,其中不显示图像。
我不知道如何将文件名传递给文件名
任何帮助都将不胜感激。
更新
我更新了超链接:<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 :(得分: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在页面加载后添加属性。