当使用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)并将其存储为单独的领域?
答案 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" /> --->