Coldfusion下载文件

时间:2013-09-25 20:59:06

标签: sql sql-server-2008 coldfusion blob varbinary

当使用coldfusion存储文件(可以是.txt,.doc,.docx)时,我希望能够检索这些文件。我一直在谷歌搜索一段时间,但似乎无法找到答案。

基本上:我如何检索可以是多种类型文件扩展名的blob(varbinary(MAX)在SQL Server 2008中),然后提供下载?

这是我的上传/下载代码,其下载让我难以理解:

<!--- <form action="resume.cfm" method="post" enctype="multipart/form-data">
    Select File: <input type="file" name="upload" />
    <input type="submit" value="Upload File" />
</form>

<cfif structKeyExists(form, "upload")>
    <cfquery datasource="#application.dsn.recAppTest#" name="resume">
    INSERT INTO resume (resume)
    VALUES(
        <cfqueryparam cfsqltype="cf_sql_blob" value="#FileReadBinary(FORM.upload)#">
    )
    </cfquery>
</cfif> --->

<cfoutput>
    <cfquery datasource="#application.dsn.recAppTest#" name="resume">
        SELECT * FROM resume
    </cfquery>
    <cfdump var="#resume#" />
</cfoutput>

<cfheader name="Content-Disposition" value="attachment; filename=""> <!--- what goes here if I don't know the incoming extension?? --->

<cfcontent type="text/plain, application/vnd.openxmlformats-officedocument.wordprocessingml.document" />

我甚至不确定这是否可行(我希望是这样),但如果没有,是否会在(在上传时)获取文件扩展名之前将其转换为数字(varbinary)并将其存储为单独的领域?

2 个答案:

答案 0 :(得分:1)

正如@imthepitts所说,你需要在收到文件时存储文件名。 <cfcontent>支持var属性,允许您通过一次操作发回文件:

<cfcontent type="application/...." var="#resume.resume#" />

确保检查代码是否适用于您的网络服务器。 JRun内置服务器发回的标题和响应略微不同于IIS或Apache。

如果需要支持早期版本的IE,请测试它们。我有一些问题,标题的顺序有所不同(即使它不应该)。我不得不放弃使用底层的HTTPServletResponse方法。 This link,虽然很旧很有用。

答案 1 :(得分:0)

这是最终的代码:

注意:

必须在cfadmin中检查BLOB,否则您将收到截断的结果。

实时代码:将文件作为varbinary数据插入sql server

评论代码:检索文件(当然需要操纵查询)并提供下载

<form action="resume.cfm" method="post" enctype="multipart/form-data">
    Select File: <input type="file" name="upload" />
    <input type="submit" value="Upload File" />
</form>

<cfif structKeyExists(form, "upload")>
    <cfset destination = expandPath("./resumes")>
    <cfif not directoryExists(destination)>
        <cfdirectory action="create" directory="#destination#">
        </cfif>
          <cffile action="upload" 
            filefield="upload" 
            destination="#destination#" 
            nameConflict="makeUnique" 
            result="resume" 
          accept="text/plain, application/vnd.openxmlformats-officedocument.wordprocessingml.document">
    <cfdump var="#resume#" />
    <cfquery datasource="#application.dsn.recAppTest#" name="queryresume">
    INSERT INTO resume (resume, filename, ext)
    VALUES(
        <cfqueryparam cfsqltype="cf_sql_blob" value="#FileReadBinary(FORM.upload)#">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#resume.serverFileName#">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#resume.serverFileExt#">
    )
    </cfquery>
    <cfset xfile="#resume.serverDirectory#\#resume.serverFile#" />
    <cfdump var="#xfile#" />
    <cffile action="delete" file="#xfile#">
</cfif>

<!--- <cfoutput>
    <cfquery datasource="#application.dsn.recAppTest#" name="resume">
        SELECT * FROM resume
    </cfquery>
    <cfdump var="#resume#" />
</cfoutput>

<cfheader name="Content-Disposition" value="attachment; filename=#resume.filename#.#resume.ext#">

<cfcontent variable="#resume.resume#" reset="true" type="text/plain, application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> --->