2009-11-26 186 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