2

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

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

这是我的上传/下载代码,其中的下载让我很困惑:

<!--- <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)之前获取文件扩展名并将其存储为单独的字段?

4

2 回答 2

1

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

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

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

如果需要支持早期版本的 IE,请进行测试。我遇到了标题的顺序产生影响的问题(即使它不应该)。我不得不放弃使用底层的 HTTPServletResponse 方法。这个链接虽然很旧,但很有用。

于 2013-09-26T13:34:38.690 回答
0

这是最终的代码:

笔记:

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

实时代码:将文件作为 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" /> --->
于 2013-09-26T14:24:11.090 回答