Hoang_philong
04-11-09, 02:11 PM
Có những file trên web server mà bạn muốn người sử dụng không thể download trực tiếp (nghĩa là nhập địa chỉ của file vào trình duyệt hoặc trình download). Lý do để bạn không muốn có thể là bạn muốn bảo mật file (chỉ những người có mật khẩu mới được download), hoặc bạn muốn đếm số lần download file đó...
Lúc này, bạn cần đến đoạn mã lệnh để download file. Đoạn mã đó như sau:
<%
Response.Buffer = True
Response.Clear
Set fso = Server.CreateObject("Scripting.FileSystemObject")
strFileName = "C:\test\test.txt" 'file can download
if not fso.FileExists(strFileName) then
Response.Write "File " & strFileName & "khong ton tai."
Response.End
end if
strFile = Right(strFileName, Len(strFileName) - InStrRev(strFileName,"\"))
strFileType = "application/octet-stream"
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(strFilename)
intFilelength = f.size
Set f = Nothing
Set fso = Nothing
Response.AddHeader "Content-Disposition", "attachment; filename=" & strFile
Response.AddHeader "Content-Length", intFilelength
Response.Charset = "UTF-8"
Response.ContentType = strFileType
Set Stream = Server.CreateObject("ADODB.Stream")
Stream.Open
Stream.type = 1
Stream.LoadFromFile strFileName
Response.BinaryWrite Stream.Read
Response.Flush
Stream.Close
Set Stream = Nothing
%>
Tuy nhiên, đoạn mã lệnh trên sẽ gặp lỗi khi ta download file có dung lượng lớn. Lỗi như sau:
Trích dẫn
Response object error 'ASP 0251 : 80004005'
Response Buffer Limit Exceeded
/itres/download2.asp, line 49
Execution of the ASP page caused the Response Buffer to exceed its configured limit.
Nguyên nhân lỗi là do sự hạn chế về buffer của web server. Để khắc phục lỗi này ta sửa đoạn lệnh trên thành như sau:
<%
Response.Buffer = False
Server.ScriptTimeout = 30000
Set fso = Server.CreateObject("Scripting.FileSystemObject")
strFileName = "C:\test\test.txt" 'file can download
if not fso.FileExists(strFileName) then
Response.Write "File " & strFileName & "khong ton tai."
Response.End
end if
strFile = Right(strFileName, Len(strFileName) - InStrRev(strFileName,"\"))
strFileType = "application/octet-stream"
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(strFilename)
intFilelength = f.size
Set f = Nothing
Set fso = Nothing
Response.AddHeader "Content-Disposition", "attachment; filename=" & strFile
Response.AddHeader "Content-Length", intFilelength
Response.Charset = "UTF-8"
Response.ContentType = strFileType
Set Stream = Server.CreateObject("ADODB.Stream")
Stream.Open
Stream.type = 1
Stream.LoadFromFile strFileName
MaxBuffer = 2048
For i = 1 To intFilelength \ MaxBuffer
If Not Response.IsClientConnected Then Exit For
Response.BinaryWrite Stream.Read(MaxBuffer)
Next
If intFilelength Mod MaxBuffer > 0 Then
If Response.IsClientConnected Then
Response.BinaryWrite Stream.Read(intFilelength Mod MaxBuffer)
End If
End If
Stream.Close
Set Stream = Nothing
%>
Để làm được chức năng trên trong ASP ta phải viết rất dài, bạn cũng có thể làm một chức năng tương tự trong PHP với lượng mã lệnh ít hơn rất nhiều. Chúng ta thử xem nhé.
Lúc này, bạn cần đến đoạn mã lệnh để download file. Đoạn mã đó như sau:
<%
Response.Buffer = True
Response.Clear
Set fso = Server.CreateObject("Scripting.FileSystemObject")
strFileName = "C:\test\test.txt" 'file can download
if not fso.FileExists(strFileName) then
Response.Write "File " & strFileName & "khong ton tai."
Response.End
end if
strFile = Right(strFileName, Len(strFileName) - InStrRev(strFileName,"\"))
strFileType = "application/octet-stream"
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(strFilename)
intFilelength = f.size
Set f = Nothing
Set fso = Nothing
Response.AddHeader "Content-Disposition", "attachment; filename=" & strFile
Response.AddHeader "Content-Length", intFilelength
Response.Charset = "UTF-8"
Response.ContentType = strFileType
Set Stream = Server.CreateObject("ADODB.Stream")
Stream.Open
Stream.type = 1
Stream.LoadFromFile strFileName
Response.BinaryWrite Stream.Read
Response.Flush
Stream.Close
Set Stream = Nothing
%>
Tuy nhiên, đoạn mã lệnh trên sẽ gặp lỗi khi ta download file có dung lượng lớn. Lỗi như sau:
Trích dẫn
Response object error 'ASP 0251 : 80004005'
Response Buffer Limit Exceeded
/itres/download2.asp, line 49
Execution of the ASP page caused the Response Buffer to exceed its configured limit.
Nguyên nhân lỗi là do sự hạn chế về buffer của web server. Để khắc phục lỗi này ta sửa đoạn lệnh trên thành như sau:
<%
Response.Buffer = False
Server.ScriptTimeout = 30000
Set fso = Server.CreateObject("Scripting.FileSystemObject")
strFileName = "C:\test\test.txt" 'file can download
if not fso.FileExists(strFileName) then
Response.Write "File " & strFileName & "khong ton tai."
Response.End
end if
strFile = Right(strFileName, Len(strFileName) - InStrRev(strFileName,"\"))
strFileType = "application/octet-stream"
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(strFilename)
intFilelength = f.size
Set f = Nothing
Set fso = Nothing
Response.AddHeader "Content-Disposition", "attachment; filename=" & strFile
Response.AddHeader "Content-Length", intFilelength
Response.Charset = "UTF-8"
Response.ContentType = strFileType
Set Stream = Server.CreateObject("ADODB.Stream")
Stream.Open
Stream.type = 1
Stream.LoadFromFile strFileName
MaxBuffer = 2048
For i = 1 To intFilelength \ MaxBuffer
If Not Response.IsClientConnected Then Exit For
Response.BinaryWrite Stream.Read(MaxBuffer)
Next
If intFilelength Mod MaxBuffer > 0 Then
If Response.IsClientConnected Then
Response.BinaryWrite Stream.Read(intFilelength Mod MaxBuffer)
End If
End If
Stream.Close
Set Stream = Nothing
%>
Để làm được chức năng trên trong ASP ta phải viết rất dài, bạn cũng có thể làm một chức năng tương tự trong PHP với lượng mã lệnh ít hơn rất nhiều. Chúng ta thử xem nhé.