【问题标题】:Renaming files when downloading it下载文件时重命名文件
【发布时间】:2009-11-26 01:25:53
【问题描述】:

我想在用户下载文件时重命名它。

现在,我正在发送 content-disposition 和 content-length 标头,然后使用 fpassthru PHP 函数将文件发送给用户。

但是这种方法有3个问题:

  1. 如果我以这种方式发送大(3-4Gb 以上)文件,那么我的 PHP 脚本运行时间过长,可能会因超时而终止。
  2. 如果用户取消下载,PHP 脚本会继续读取并发送文件
  3. 如果用户暂停下载,以后将无法继续下载。

有没有更好的方法在下载时重命名文件?

【问题讨论】:

    标签: php


    【解决方案1】:
    <?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;
        }
    }
    
    1. 如果用户使用connection_status()取消浏览器,您可以停止PHP脚本

    2. HTTP 无法重新连接已关闭的连接。 FTP可以!

    【讨论】:

    • 太棒了。这正是我现在所做的,只使用 fpassthru 函数而不是 readfile。但是您的解决方案将如何帮助解决我在问题中指出的这三个问题?
    【解决方案2】:

    自从提出问题以来,已经过去了一段时间,html5 给了我们不同的方法:

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

    attribute 下载 (learn more) 定义了默认的filename 用于在客户端计算机上存储文件(他仍然可以更改它!)。

    注意:这不会影响您服务器上的任何内容。

    【讨论】:

    • 有趣,这可以避免大量服务器端代码,但不适用于旧版 Old Chap IE。
    • @RienNeVaPlus,它适用于 Windows 系统但不适用于 Linux 系统。知道如何在 Linux 系统上实现它吗?
    【解决方案3】:

    对于第三点,您可以尝试使用 HTTP Range 标头。
    如果用户有一个支持恢复的下载客户端,它应该将这些标头发送到您的脚本,您可以使用它来准确指出要发送文件的哪些部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2013-02-14
      • 2011-12-29
      • 2010-12-22
      • 2020-10-04
      • 2017-07-31
      相关资源
      最近更新 更多