首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ColdFusion 9强制下载页面上捕获错误

在ColdFusion 9强制下载页面上捕获错误
EN

Stack Overflow用户
提问于 2012-06-26 07:41:08
回答 4查看 355关注 0票数 1

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

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

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

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

这是我的强制下载页面,它接受一个文件夹名称变量和一个文件名变量来提供文件。

代码语言:javascript
复制
<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>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-26 14:29:09

这里有三个您想要实现的目标:

  1. 安全地为文件提供服务。目前还没有保护您不能利用系统(或其他用户)文件,例如(我设置的是传递的值,而不是URL键):

  • 如果文件或目录不再存在,则显示404页。

  • 下载开始后,显示一些漂亮的页。也许我遗漏了一些东西,但在下载开始后重定向用户(=发送标题)是相当棘手的。

无论如何,对于所有这些,都有非常简单和可靠的解决方案。

您应该将文件列表保存在数据库中,因此每条记录可能包括:

  1. 唯一ID。
  2. 文件所有者类型名称。
  3. 文件类型(可选,您可以使用filename).
  4. Content类型(可选,您仍然可以使用具有计划日期的方法(可选,可用于计划的cleaning).
  5. Downloads计数器(可选,如果要限制下载count).
  6. Status (可选,可用于阻止对已删除文件进行文件系统检查)。

注意: 3-4可以作为单列('path/filename.ext')来完成,因为路径无论如何都是临时的。

因此,当您的应用程序执行creates a list of links to download the files and emails the client with the list of links.时,它还会将每个文件记录到数据库中。现在,这些链接中的每一个都可能如下所示:

代码语言:javascript
复制
<a href="http://yourwebsite.tld/download.cfm?file=#ID#">#DESCRIPTION#</a>

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

  1. 检查数据库中是否存在ID。如果不匹配--重定向到404页。
  2. 检查当前用户是否与所有者ID匹配。如果不匹配--重定向到404页。
  3. 检查文件状态,下载计数器(如果需要限制)。如果不存在,则重定向到404页。
  4. 使用存储的目录和文件名检查实际文件是否存在。如果没有--重定向到404HTMLURL中有一个HTML键:递增下载计数器,使用cfcontent和content type.
  5. ELSE提供文件,呈现页面的start,显示“下载将立即开始,如果您不想等待,请单击此链接”,链接看起来像download.cfm?file=#ID#&start=yes,再加上您有具有相同URL的meta http-equiv="refresh"

备注:

  1. 步骤1-4可以用自定义的errorCode包装在单个的try/catch块中,所以你可以在步骤5中有一个地方的redirect.
  2. Trick,这里是当用户点击下载链接时,用户将停留在页面上,不会看到空白页面。这不是目标#3的确切解决方案,但如果没有一些技巧,就很难做出更好的东西。也许我错了,有人可以在这里建议更好的方法,这会很酷的。您可以删除“单击此链接部分”以使此页面看起来“自然”。
票数 3
EN

Stack Overflow用户

发布于 2012-06-26 08:28:44

如果您的站点有一个404页面,那么您已经将他们定向到了一个错误页面。或者至少你的web服务器是。如果您没有设置站点范围内的404页面,请将其设置为cfm页面,以便为您提供一些额外的功能(日志、警报等)

票数 0
EN

Stack Overflow用户

发布于 2012-06-26 11:46:24

您可以使用FileExists检查是否存在,并在此基础上做出决定:

代码语言:javascript
复制
<cfif NOT FileExists(fileToGetSizeOf)>
  <!--- send a 404 --->
<cfelse>
  <!--- send the file --->
</cfif>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11198942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档