PDA

View Full Version : Đoạn mã lệnh cho phép download 1 file (ASP)


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é.