Exception handling 捕获ColdFusion 9强制下载页面上的错误

Exception handling 捕获ColdFusion 9强制下载页面上的错误,exception-handling,coldfusion,coldfusion-9,Exception Handling,Coldfusion,Coldfusion 9,我正在为我们的办公室创建一个应用程序,允许办公室中经过身份验证的用户为客户上传文件,创建一个链接列表以下载文件,并通过电子邮件向客户发送链接列表 办公室中的用户登录时,会在其会话范围内为其分配UUID。UUID将成为上传文件存储的目录名 有时我需要清除旧文件并删除目录,但当这种情况发生时,客户端可能会尝试从旧链接重新下载文件 在ColdFusion 9中,我如何捕捉这些信息并将它们发送到错误页面?我还希望在下载开始后使用类似的代码重定向用户,这样他们就不会在下载过程中坐在空白页上 这是我的强制下

我正在为我们的办公室创建一个应用程序,允许办公室中经过身份验证的用户为客户上传文件,创建一个链接列表以下载文件,并通过电子邮件向客户发送链接列表

办公室中的用户登录时,会在其会话范围内为其分配UUID。UUID将成为上传文件存储的目录名

有时我需要清除旧文件并删除目录,但当这种情况发生时,客户端可能会尝试从旧链接重新下载文件

在ColdFusion 9中,我如何捕捉这些信息并将它们发送到错误页面?我还希望在下载开始后使用类似的代码重定向用户,这样他们就不会在下载过程中坐在空白页上

这是我的强制下载页面,它使用文件夹名称变量和文件名变量来提供文件

<cfset folder = #URL.folder#>
<cfset FileDownload = #URL.file#>

<cfset exten = ListLast(FileDownload, ".")>

<cfswitch expression="#exten#">
<cfcase value="zip"><cfset content_type = "application/zip, application/x-zip, application/x-zip-compressed, application/octet-stream, application/x-compress, application/x-compressed, multipart/x-zip"></cfcase>
<cfcase value="ai"><cfset content_type = "application/illustrator"></cfcase>
<cfcase value="eps"><cfset content_type = "application/illustrator, application/octect-stream"></cfcase>
<cfcase value="pdf"><cfset content_type = "application/pdf, application/x-pdf, application/acrobat, applications/vnd.pdf, text/pdf, text/x-pdf"></cfcase>
<cfcase value="psd"><cfset content_type = "image/photoshop, image/x-photoshop, image/psd, application/photoshop"></cfcase>
<cfcase value="jpg"><cfset content_type = "image/jpeg"></cfcase>
<cfcase value="png"><cfset content_type = "image/png"></cfcase>
<cfcase value="tif"><cfset content_type = "image/tiff"></cfcase>
<cfdefaultcase><cfset content_type = "image/jpeg"></cfdefaultcase>
</cfswitch>

<cfset fileToGetSizeOf = expandPath("./#folder#/#FileDownload#") />


<cfoutput><cfheader name="content-disposition" value="attachment;filename=#FileDownload#"><cfheader name="content-length" value="#getFileInfo(fileToGetSizeOf ).size#" />
<cfcontent type="#content_type#" file="#ExpandPath("./#folder#")#/#FileDownload#" deletefile="#delete_file#"></cfoutput>


如果您的站点有404页面,则您已将其指向错误页面。或者至少您的web服务器是。如果您没有设置站点范围的404页面,请将其设置为cfm页面,以提供一些额外的功能(日志记录、警报等)

您可以使用
FileExists
检查是否存在,并根据以下情况做出决定:

<cfif NOT FileExists(fileToGetSizeOf)>
  <!--- send a 404 --->
<cfelse>
  <!--- send the file --->
</cfif>

这里有三个目标要实现:

  • 安全地提供文件。目前,系统(或其他用户)文件无法保护您免受攻击,例如(我设置了传递值而不是URL键):

    当用户单击链接时,脚本将执行以下操作:

  • 检查数据库中是否存在ID。如果不是--重定向到404页
  • 检查当前用户是否与所有者ID匹配。如果不匹配,则重定向到404页
  • 检查文件状态、下载计数器(如果需要限制)。如果不是--重定向到404页
  • 使用存储的目录和文件名检查实际存在的文件。如果不是--重定向到404页
  • 如果URL中有一个
    开始
    键:增加下载计数器,使用cfcontent和content type为文件提供服务
  • ELSE呈现页面的HTML,显示“下载将立即开始,如果您不想等待,请单击此链接”,其中的链接类似于
    Download.cfm?file=#ID#&start=yes
    ,并且您有相同URL的
    meta http equiv=“refresh”
  • 注:

  • 步骤1-4可以包装在带有自定义
    errorCode
    的单个try/catch块中,因此您可以有一个重定向位置
  • 第五步的诀窍在于,当用户点击下载链接时,他们会停留在页面上,不会看到空白页面。这并不是目标3的精确解决方案,但如果不耍花招,就很难做出更好的事情。也许我错了,有人可以在这里建议更好的方法,那会很酷。您可以删除“单击此链接部分”以使此页面看起来“自然”

  • 您可以使用FileExists(绝对路径)功能检查下载的文件是否存在

    <cfset folder = "../../../some/other/path/" />
    <cfset FileDownload = "some_other_file.pdf" />
    
    <a href="http://yourwebsite.tld/download.cfm?file=#ID#">#DESCRIPTION#</a>