2007/04/01

網站提供檔案下載的技巧

昨天晚上睡覺時,濟公活佛要破天機,並且要我傳達,普渡眾生。

破題:提供檔案下載時,如何隱藏檔案在Server上的實際路徑?

這個問題其實很簡單,且應用也很管飯,先來討論做法吧

祕訣在於HTTPHeader,先設定對應的Content Type,然後ㄋㄟ,看你想編什麼鬼名字都可以哦,但是建議副檔名不要亂給,以免使用者下載後沒有人知道要怎麼打開,也不建議用中文啦,哈哈。
此例我們以下載zip做示範:

PHP版:


header("Content-type: application/zip");
header('Content-Disposition: attachment; filename="什麼鬼.zip"');
readfile("/真正檔案的路徑/真正檔案的名稱.zip");



Java版:
若採用Struts,建議寫成action

PrintWriter out = response.getWriter();
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename="什麼鬼.zip");

BufferedInputStream in = new BufferedInputStream(new FileInputStream("/真正檔案的路徑/真正檔案的名稱.zip"));
byte[] buf = new byte[4 * 1024]; // 4K buffer
int bytesRead;
while ((bytesRead = in.read()) != -1) {
out.write(bytesRead);
}
in.close();
out.close();



VB.NET版:
感謝sunflier提供,我不用買Vista啦 :D

Response.ClearContent()
Response.ContentType = "text/plain"
Response.AppendHeader("Content-Disposition", "Attachment; Filename=你要的檔名")
Response.WriteFile(實際存在硬碟的路徑)
Response.End()



討論:如果想要限制使用者一定要從固定的網址才能下載檔案,也可以用此法,先判斷來源,再確定給不給下載(如果不懂這句話,想像一下,你辛辛苦苦弄了一些A圖,想要替你的網站增加些流量,好讓Sponsor心甘情願的拿出錢來,別人卻把你的圖直接放在他的網站那裡,變成你幫他賺錢,真讓人垂心肝啊)

ps.
  1. 不曉得,不確定到底下載的檔案是什麼,Content Type可以設成"application/x-download"

3 則留言 :

sunflier 提到...

VB.NET版


Response.ClearContent()
Response.ContentType = "text/plain"
Response.AppendHeader("Content-Disposition", "Attachment; Filename=你要的檔名")
Response.WriteFile(實際存在硬碟的路徑)
Response.End()

sorry 提到...

感謝Sunflier的補充:D

但是content-type用"text/plain"可以嗎?

sunflier 提到...

這個就要看下載的檔案類型了
(如同學長本文提到的)

我提供的範例是供下載txt的檔案~