怎样实现直接下载?

时间:2022-05-07 15:13:30
我能够实现先将查询结果生成一个Excel文件放在服务器上,然后用户下载,但是如果用户多了的话,文件也就多了,服务器受不了。应该怎么解决这个问题?

我想过让用户下载完了之后,将该文件删除,可是不会实现,还有怎么能知道用户是否下载完了呢?再说如果用户只是查看,不需要下载呢?应该怎么解决?

25 个解决方案

#1


1、可以限制在线下载人数~~做一个排队~~
2、晕~~下载完了删除掉那还会怕服务器受不了??都没得下了~~
可以做权限,未注册只查看。注册的可以下载~~

#2


是难题。

#3


怎么判断已经下载完毕,是难题啊

#4


不简单

#5


不用生成文件的,直接把生成的二进制流发送到浏览器(下载或显示都可以)即可

#6


Global.asa 中写Session_OnEnd 事件,Session_OnEnd 中删除文件。

#7


Response.AddHeader "Content-Disposition", "attachment; filename=temp.xls"   
  Response.Charset = "UTF-8"
  Response.ContentType = "application/vnd.ms-excel"

  Response.BinaryWrite 二进制数据

#8


直接修改HEADER就OK了。
参见楼上的代码。

#9


这个二进制数据是怎样生成的?就是我的查询结果吧?怎样才是二进制数据呢?

#10


在数据库里不是有一个OLE对像吧,那个就是二进制数据了!

#11


不会用这个OLE.我是把要输出的内容都放在一个字符串里面,然后用scripting.filesystemobject的createtextfile函数生成一个xls文件,将这个字符串写进这个xls文件里面。

#12


TO:possible_Y(本人签名需要刮开,方可看到) 

怎样直接把生成的二进制流发送到浏览器(下载或显示都可以)?

#13


<%@ Language=VBScript %>
<%
Option Explicit
Response.ContentType="application/octet-stream"
Response.AddHeader "Content-Disposition","attachment; filename=test.csv"
Response.Expires=-1

Dim Rs,strSQL,g_connectstr,g_bancho,Stream
Dim i

g_connectstr="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=bancho;Initial Catalog=luna;Data Source=."
'g_connectstr="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=password;Initial Catalog=RentDB;Data Source=."
Set g_bancho = Server.CreateObject("ADODB.connection")
g_bancho.Open g_connectstr

Set Rs=Server.CreateObject("ADODB.Recordset")

strSQL="select "
strSQL=strSQL & " FOODID,"
strSQL=strSQL & " FOODNAME,"
strSQL=strSQL & " REALSECION,"
strSQL=strSQL & " NOWCOUNT"

strSQL=strSQL & " from material_manage "


'strSQL=strSQL & " WHERE " & Request.Form("querystr")
'Response.Write strSQL
Rs.Open strSQL,g_bancho,2,4

Set Stream=server.CreateObject("ADODB.Stream")
Stream.Type=1
Stream.Open
Stream.LoadFromFile Server.MapPath("test.csv")

If Rs.EOF Then
Response.Write "データがありません。"
Else
Response.Write """"
Response.Write "FOODID"
Response.Write ""","
Response.Write """"
Response.Write "FOODNAME"
Response.Write ""","
Response.Write """"
Response.Write "REALSECION"
Response.Write ""","
Response.Write """"
Response.Write "NOWCOUNT"
Response.Write ""","
Response.Write vbCrLf
Do until Rs.EOF
Response.Write """"
Response.Write Rs("FOODID")
Response.Write ""","
Response.Write """"
Response.Write Rs("FOODNAME")
Response.Write ""","
Response.Write """"
Response.Write Rs("REALSECION")
Response.Write ""","
Response.Write """"
Response.Write Rs("NOWCOUNT")
Response.Write ""","
Response.Write vbCrLf
Rs.MoveNext
Loop
End If

'While Not Stream.EOS
    'Response.BinaryWrite Stream.Read(1024 * 64)
'Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>
<script language="javascript">
window.close();
</script>
我的这个页面是download时候使用的,你在点击按钮那里转向这个页面,用户会自动下载test.csv文件
Stream.LoadFromFile Server.MapPath("test.csv")//可以些别的文件名,下载的名称就是你写的名称

#14


学习,外加试验,今日频繁关注此帖中.......

#15


好像还需要注意不是IE浏览器的情况,以下供你参考(如有错误还请各位大师指正):
IE5以上的情况
Response.ContentType = "application/octet-stream-dummy"
其他浏览器的情况
Response.ContentType = "application/octet-stream"

#16


我还没有从数据库里面取数据,仅仅是下面这样,就报了500的错误。请前辈指点一下。我觉得没有错误啊。
<%@ Language=VBScript %>
<!-- #include file="ADOFunction.asp"-->
<%
Option Explicit
Response.ContentType="application/octet-stream"
Response.AddHeader "Content-Disposition","attachment; filename=test.csv"
Response.Expires=-1

Dim strSQL, Stream

'strSQL = " SELECT * FROM test_upload "
'Set Rs = GetRecordSet("used","used","used",strSQL)

Set Stream=server.CreateObject("ADODB.Stream")
Stream.Type=1
Stream.Open
Stream.LoadFromFile Server.MapPath("test.csv")

Response.Write """"
Response.Write "FOODID"
Response.Write ""","
Response.Write """"
Response.Write "FOODNAME"
Response.Write ""","
Response.Write """"
Response.Write "REALSECION"

Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>

#17


手头刚好写了个函数~~~试试看吧~~~
<%
Const ForReading=1
Const TristateTrue=-1 'Unicode
Const FILE_TRANSFER_SIZE=16384 '16k

'下面这行只在IIS4/PWS中使用,对于IIS5是默认值,不用设置Response.Buffer = True

'传送文件函数
'参数说明:path要向浏览器发送的文件在服务器端的路径&文件名(必须是绝对路径)
     mimeType文件类型
     filename浏览器端显示的文件名
Function TransferFile(path, mimeType, filename)
Dim objFileSystem, objFile, objStream
Dim char
Dim sent
send=0
TransferFile = True

Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = objFileSystem.GetFile(Path)
Set objStream = objFile.OpenAsTextStream(ForReading, TristateTrue)

Response.AddHeader "content-type", mimeType
response.AddHeader "Content-Disposition","attachment;filename="&filename 
Response.AddHeader "content-length", objFile.Size

Do While Not objStream.AtEndOfStream
    char = objStream.Read(1)
    Response.BinaryWrite(char)
    sent = sent + 1
    If (sent MOD FILE_TRANSFER_SIZE) = 0 Then
        Response.Flush
        If Not Response.IsClientConnected Then
            TransferFile = False
            Exit Do
        End If
    End If
Loop

Response.Flush
If Not Response.IsClientConnected Then TransferFile = False

objStream.Close
Set objStream = Nothing
Set objFileSystem = Nothing
End Function

'调用示例:
Dim path, mimeType, sucess
'下面写的是绝对路径,在实际使用中可以使用server.mappath()来获取站内文件的绝对路径
path = "C:\Inetpub\wwwroot\help.gif"
mimeType = "application/x-msdownload" 
sucess = TransferFile(path, mimeType,"help.gif")
Response.End
%>

#18


补充一下,由于注释是发贴时写的,函数说明的后两行没打注释符号,呵呵
修改如下:

'参数说明:path要向浏览器发送的文件在服务器端的路径&文件名(必须是绝对路径)
'     mimeType文件类型
'     filename浏览器端显示的文件名

#19


to itzhiren (itzhiren):我帮你顶,我也不要分,我就是想学些知识。 
各位前辈我还是没有成功,改了一个上午了,还是500的错误。
其实我的目的很简单,就是从数据库中读出数据(不在服务器端生成文件),之后客户端能直接选择打开或者保存,这个文件需要写成csv的格式在客户端保存或者打开。

#20


如果你不嫌麻烦,可以试试这个办法
   数据库里读出数据以后,在服务器端生成(供客户打开查看)
   另:在下脚或上角再设立一个下载点,
这样做,从技术角度来做应该是比较容易一些的

至于
我想过让用户下载完了之后,将该文件删除,
这个你可以作成静态页面(也就是说把你读出来的东西做成静态页面),这样让用户直接查看或保存都是比较容易的(保存采用:文件——另存为),设立一个时钟,设定时间,在时间到了后直接由服务器自动删除。

上述两种是不同的方法。
第二种适合于流量大的阅读,虽然它对服务器的容量要求加大,静态页面比动态的要大

#21


up

#22


asp怎样设立时钟?

#23


晕,你到现在还没结贴阿
<SCRIPT language="JavaScript">
var objs=document.getElementsByName("a");
function b(){
for(i=0;i<objs.length;i++){
obj=objs[i];
obj.style.visibility = "hidden";
}
setTimeout("c()", 500);
}
function c() {
for(i=0;i<objs.length;i++){
obj=objs[i];
obj.style.visibility = "visible";
}
setTimeout("b()", 500);
}
//-->
b();
c();
</SCRIPT>
<body bgcolor="#FFFFFF" leftmargin="5" topmargin="5" marginwidth="0" marginheight="0" text="#222222" link="#3330A0" vlink="#3330A0" alink="#3330A0" onLoad="c()">
发我才问出结果的东西给你看看吧
这段脚本让页面里的id="a"的控件实现闪烁

#24


你给电信公司做东西吗?
电信公司的通话详单 和你讲的一样
他们是判断 用户是否已经退出登录 
如果 退出登录 就将已经生成的文件删除
这样服务器商 就不会保留不用的文件了

#25


学习

#1


1、可以限制在线下载人数~~做一个排队~~
2、晕~~下载完了删除掉那还会怕服务器受不了??都没得下了~~
可以做权限,未注册只查看。注册的可以下载~~

#2


是难题。

#3


怎么判断已经下载完毕,是难题啊

#4


不简单

#5


不用生成文件的,直接把生成的二进制流发送到浏览器(下载或显示都可以)即可

#6


Global.asa 中写Session_OnEnd 事件,Session_OnEnd 中删除文件。

#7


Response.AddHeader "Content-Disposition", "attachment; filename=temp.xls"   
  Response.Charset = "UTF-8"
  Response.ContentType = "application/vnd.ms-excel"

  Response.BinaryWrite 二进制数据

#8


直接修改HEADER就OK了。
参见楼上的代码。

#9


这个二进制数据是怎样生成的?就是我的查询结果吧?怎样才是二进制数据呢?

#10


在数据库里不是有一个OLE对像吧,那个就是二进制数据了!

#11


不会用这个OLE.我是把要输出的内容都放在一个字符串里面,然后用scripting.filesystemobject的createtextfile函数生成一个xls文件,将这个字符串写进这个xls文件里面。

#12


TO:possible_Y(本人签名需要刮开,方可看到) 

怎样直接把生成的二进制流发送到浏览器(下载或显示都可以)?

#13


<%@ Language=VBScript %>
<%
Option Explicit
Response.ContentType="application/octet-stream"
Response.AddHeader "Content-Disposition","attachment; filename=test.csv"
Response.Expires=-1

Dim Rs,strSQL,g_connectstr,g_bancho,Stream
Dim i

g_connectstr="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=bancho;Initial Catalog=luna;Data Source=."
'g_connectstr="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=password;Initial Catalog=RentDB;Data Source=."
Set g_bancho = Server.CreateObject("ADODB.connection")
g_bancho.Open g_connectstr

Set Rs=Server.CreateObject("ADODB.Recordset")

strSQL="select "
strSQL=strSQL & " FOODID,"
strSQL=strSQL & " FOODNAME,"
strSQL=strSQL & " REALSECION,"
strSQL=strSQL & " NOWCOUNT"

strSQL=strSQL & " from material_manage "


'strSQL=strSQL & " WHERE " & Request.Form("querystr")
'Response.Write strSQL
Rs.Open strSQL,g_bancho,2,4

Set Stream=server.CreateObject("ADODB.Stream")
Stream.Type=1
Stream.Open
Stream.LoadFromFile Server.MapPath("test.csv")

If Rs.EOF Then
Response.Write "データがありません。"
Else
Response.Write """"
Response.Write "FOODID"
Response.Write ""","
Response.Write """"
Response.Write "FOODNAME"
Response.Write ""","
Response.Write """"
Response.Write "REALSECION"
Response.Write ""","
Response.Write """"
Response.Write "NOWCOUNT"
Response.Write ""","
Response.Write vbCrLf
Do until Rs.EOF
Response.Write """"
Response.Write Rs("FOODID")
Response.Write ""","
Response.Write """"
Response.Write Rs("FOODNAME")
Response.Write ""","
Response.Write """"
Response.Write Rs("REALSECION")
Response.Write ""","
Response.Write """"
Response.Write Rs("NOWCOUNT")
Response.Write ""","
Response.Write vbCrLf
Rs.MoveNext
Loop
End If

'While Not Stream.EOS
    'Response.BinaryWrite Stream.Read(1024 * 64)
'Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>
<script language="javascript">
window.close();
</script>
我的这个页面是download时候使用的,你在点击按钮那里转向这个页面,用户会自动下载test.csv文件
Stream.LoadFromFile Server.MapPath("test.csv")//可以些别的文件名,下载的名称就是你写的名称

#14


学习,外加试验,今日频繁关注此帖中.......

#15


好像还需要注意不是IE浏览器的情况,以下供你参考(如有错误还请各位大师指正):
IE5以上的情况
Response.ContentType = "application/octet-stream-dummy"
其他浏览器的情况
Response.ContentType = "application/octet-stream"

#16


我还没有从数据库里面取数据,仅仅是下面这样,就报了500的错误。请前辈指点一下。我觉得没有错误啊。
<%@ Language=VBScript %>
<!-- #include file="ADOFunction.asp"-->
<%
Option Explicit
Response.ContentType="application/octet-stream"
Response.AddHeader "Content-Disposition","attachment; filename=test.csv"
Response.Expires=-1

Dim strSQL, Stream

'strSQL = " SELECT * FROM test_upload "
'Set Rs = GetRecordSet("used","used","used",strSQL)

Set Stream=server.CreateObject("ADODB.Stream")
Stream.Type=1
Stream.Open
Stream.LoadFromFile Server.MapPath("test.csv")

Response.Write """"
Response.Write "FOODID"
Response.Write ""","
Response.Write """"
Response.Write "FOODNAME"
Response.Write ""","
Response.Write """"
Response.Write "REALSECION"

Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>

#17


手头刚好写了个函数~~~试试看吧~~~
<%
Const ForReading=1
Const TristateTrue=-1 'Unicode
Const FILE_TRANSFER_SIZE=16384 '16k

'下面这行只在IIS4/PWS中使用,对于IIS5是默认值,不用设置Response.Buffer = True

'传送文件函数
'参数说明:path要向浏览器发送的文件在服务器端的路径&文件名(必须是绝对路径)
     mimeType文件类型
     filename浏览器端显示的文件名
Function TransferFile(path, mimeType, filename)
Dim objFileSystem, objFile, objStream
Dim char
Dim sent
send=0
TransferFile = True

Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = objFileSystem.GetFile(Path)
Set objStream = objFile.OpenAsTextStream(ForReading, TristateTrue)

Response.AddHeader "content-type", mimeType
response.AddHeader "Content-Disposition","attachment;filename="&filename 
Response.AddHeader "content-length", objFile.Size

Do While Not objStream.AtEndOfStream
    char = objStream.Read(1)
    Response.BinaryWrite(char)
    sent = sent + 1
    If (sent MOD FILE_TRANSFER_SIZE) = 0 Then
        Response.Flush
        If Not Response.IsClientConnected Then
            TransferFile = False
            Exit Do
        End If
    End If
Loop

Response.Flush
If Not Response.IsClientConnected Then TransferFile = False

objStream.Close
Set objStream = Nothing
Set objFileSystem = Nothing
End Function

'调用示例:
Dim path, mimeType, sucess
'下面写的是绝对路径,在实际使用中可以使用server.mappath()来获取站内文件的绝对路径
path = "C:\Inetpub\wwwroot\help.gif"
mimeType = "application/x-msdownload" 
sucess = TransferFile(path, mimeType,"help.gif")
Response.End
%>

#18


补充一下,由于注释是发贴时写的,函数说明的后两行没打注释符号,呵呵
修改如下:

'参数说明:path要向浏览器发送的文件在服务器端的路径&文件名(必须是绝对路径)
'     mimeType文件类型
'     filename浏览器端显示的文件名

#19


to itzhiren (itzhiren):我帮你顶,我也不要分,我就是想学些知识。 
各位前辈我还是没有成功,改了一个上午了,还是500的错误。
其实我的目的很简单,就是从数据库中读出数据(不在服务器端生成文件),之后客户端能直接选择打开或者保存,这个文件需要写成csv的格式在客户端保存或者打开。

#20


如果你不嫌麻烦,可以试试这个办法
   数据库里读出数据以后,在服务器端生成(供客户打开查看)
   另:在下脚或上角再设立一个下载点,
这样做,从技术角度来做应该是比较容易一些的

至于
我想过让用户下载完了之后,将该文件删除,
这个你可以作成静态页面(也就是说把你读出来的东西做成静态页面),这样让用户直接查看或保存都是比较容易的(保存采用:文件——另存为),设立一个时钟,设定时间,在时间到了后直接由服务器自动删除。

上述两种是不同的方法。
第二种适合于流量大的阅读,虽然它对服务器的容量要求加大,静态页面比动态的要大

#21


up

#22


asp怎样设立时钟?

#23


晕,你到现在还没结贴阿
<SCRIPT language="JavaScript">
var objs=document.getElementsByName("a");
function b(){
for(i=0;i<objs.length;i++){
obj=objs[i];
obj.style.visibility = "hidden";
}
setTimeout("c()", 500);
}
function c() {
for(i=0;i<objs.length;i++){
obj=objs[i];
obj.style.visibility = "visible";
}
setTimeout("b()", 500);
}
//-->
b();
c();
</SCRIPT>
<body bgcolor="#FFFFFF" leftmargin="5" topmargin="5" marginwidth="0" marginheight="0" text="#222222" link="#3330A0" vlink="#3330A0" alink="#3330A0" onLoad="c()">
发我才问出结果的东西给你看看吧
这段脚本让页面里的id="a"的控件实现闪烁

#24


你给电信公司做东西吗?
电信公司的通话详单 和你讲的一样
他们是判断 用户是否已经退出登录 
如果 退出登录 就将已经生成的文件删除
这样服务器商 就不会保留不用的文件了

#25


学习