2009-11-26 185 views
6

我想在用戶下載文件時重命名文件。下載文件時重命名文件

現在,我發送content-disposition和content-length頭文件,然後用fpassthru PHP函數向用戶發送文件。

但有3個問題用這種方法:

  1. 如果我要送大(以上3-4GB)文件這樣,那麼我的PHP腳本運行了太多的時間,並且可以通過超時被殺死。
  2. 如果用戶取消下載,PHP腳本繼續讀取併發送文件
  3. 如果用戶暫停下載,他不能在以後恢復。

有沒有更好的方法來重命名下載文件?

回答

12
<?php 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 
  1. 該文件將提供下載的「downloaded.pdf」,而其最初的名字是「original.pdf」。

僞代碼

while(1) { 
    Echo "..."; //<-- send this to the client 
    if (connection_status()!=0){ 
    die; 
    } 
} 
  • 可以停止PHP腳本如果用戶通過使用connection_status()

  • HTTP不能重新連接一個取消該瀏覽器關閉連接。 FTP可以!

  • +0

    太好了。這正是我現在所做的,只使用fpassthru函數而不是readfile。 但是您的解決方案將如何幫助解決我指出的三個問題? – Boffin 2009-11-26 01:34:37

    1

    對於第三點,您可以嘗試使用HTTP Range標題。
    如果用戶擁有支持簡歷的下載客戶端,它應該將這些頭文件發送到您的腳本,您可以使用該腳本精確確定要發送的文件的哪些部分。

    12

    既然有人問,一段時間已經過去,並html5給了我們一個不同的方法來這樣:

    <a href="someWeiredFileName.rar" download="coolFilename.rar">Download</a> 
    

    attribute下載learn more)定義了默認filename存儲上的文件客戶端電腦(他仍然可以改變它!)。

    注意:這不會影響您服務器上的任何內容。

    +0

    有趣的是,這可以避免大量的服務器端代碼,但不適用於舊版Chap IE。 – 2013-11-19 17:28:31

    +0

    @RienNeVaPlus,它適用於Windows系統,但不適用於Linux系統。任何想法我們如何才能實現它的Linux系統? – kalidasan 2015-10-06 14:10:38