从数据库读取的文件如何下载的时候是原文件名?

harrizon 2002-08-03 09:54:51
我使用asp+sql server2000

我将上载的文件保存到数据库中
数据库结构如下
3 uploadID int 4 0
0 filename char 50 1
0 Content_Type char 50 1
0 filedata image 16 1
0 filesize int 4 1
0 uploadtime datetime 8 1
在另外一个页面(read.asp)显示的时候
我希望显示文件名,点击文件名,能够从数据库读取文件
现在问题是
如果上载的文件是abc.doc(word格式)等
下载的时候文件名为read.doc
如果上载的文件是abc.exe(其他格式)等
下载的时候文件名为read.asp
很不方便,我希望,无论是什么格式
下载的时候提示我保存依然是原文件名
请问如何做到??
谢谢

...全文
80 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
harrizon 2002-08-13
  • 打赏
  • 举报
回复
非常感谢hchxxzx(独自前行)!!!
谢谢
qiushuiwuhen(秋水无恨) :你的方法我没有试
只是有点疑虑
call dl("images/012922501.gif","t1.gif")
我现在的文件是从数据库中读出来的
而不是存在于images/012922501.gif
所以可能有点困难
不过你的办法对于下载网站非常有用,也非常感谢
harrizon 2002-08-09
  • 打赏
  • 举报
回复
惭愧!!看了半天还是不明白
下面是我简化的源程序
干脆你帮我直接修改好了
给你添麻烦了
谢谢!!

<!--#include File="../inc/conn.asp"-->
<%
Function SetForDisplay(field, contentType)
contentType = LCase(trim(contentType))
nFieldSize = field.ActualSize
bytes = field.GetChunk(nFieldSize)
Session("Bytes") = bytes
Session("Type") = contentType
End Function

sql = "select * from tbl_upload where uploadid=" & request("ID")
Set oRS = Server.CreateObject("ADODB.Recordset")
oRS.CursorLocation = 3
oRS.Open sql, conn

SetForDisplay oRS("filedata"), oRS("content_type")
Set oRS.ActiveConnection = Nothing

'读取数据库中保存的内容
response.Expires = 0
response.Buffer = True
response.Clear
response.contentType = Session("Type")
response.BinaryWrite Session("Bytes")
Session("Type") = ""
Session("Bytes") = ""
response.write(Session("Type"))
response.End
%>
qiushuiwuhen 2002-08-09
  • 打赏
  • 举报
回复
<%
function dl(f,n)
on error resume next

set s=CreateObject("Adodb.Stream")
S.Mode=3
S.Type=1
S.Open
s.LoadFromFile(server.mappath(f))
if err.number>0 then
response.write err.number & ":" & err.description
else
response.contentType="application/x-gzip"
response.addheader "Content-Disposition:","attachment; filename=" & n
response.binarywrite(s.Read)
end if
end function

call dl("images/012922501.gif","t1.gif")
%>
hchxxzx 2002-08-09
  • 打赏
  • 举报
回复
response.contentType = Session("Type")
response.BinaryWrite Session("Bytes")

把上面的第一句换成下面这句
Response.AddHeader "Content-Disposition", "attachment;filename="""
& varfilename & """"

当然,varfilename这是一个变量,必须你自己指定(名字),一般你上传的时候要有一个字段来存放原来文件的名字。
hchxxzx 2002-08-09
  • 打赏
  • 举报
回复
response.contentType = Session("Type")
response.BinaryWrite Session("Bytes")

把上面的第一句换成下面这句
Response.AddHeader "Content-Disposition", "attachment;filename="""
& varfilename & """"

当然,varfilename这是一个变量,必须你自己指定(名字),一般你上传的时候要有一个字段来存放原来文件的名字。
tripofdream 2002-08-05
  • 打赏
  • 举报
回复
content-disposition 的 HTTP response header 允许指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。如果没有指定,则对话框中就会出现asp文件的的名字。
(参考RFC 2183)
harrizon 2002-08-05
  • 打赏
  • 举报
回复
cat_hsfz() :
可以把数据库中的文件读出来生成文件,
这个文件的文件名怎么确定?
如何redirect到该动态生成的文件
就可以下载??
我要求当点击文件下载的时候,通常会提示你保存或者打开文件
保存的就是这个原文件名
怎么办啊?

tripofdream(梦之旅) :
老实说
你的这段代码有点陌生
可能这真是精华所在了
我还没有完全搞明白
tripofdream 2002-08-03
  • 打赏
  • 举报
回复
Response.AddHeader "Content-Disposition", "attachment;filename="""
& varfilename & """"
cat_hsfz 2002-08-03
  • 打赏
  • 举报
回复
你可以做成动态链接——在下载页面只链接一个redirect的asp,在这个asp中,你可以把数据库中的文件读出来生成文件,然后把用户redirect到你的动态生成的文件。

当该文件一段时间没有请求后,删除该文件。这也是一种防止盗链的方法(如果你的redirect的asp验证http_referer的话)。

如果这还不能满足你的要求,我想你最好自己写服务器,不要用iis

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧