【问题标题】:Renaming Download File Using Header in PHP在 PHP 中使用 Header 重命名下载文件
【发布时间】:2023-03-14 01:16:01
【问题描述】:

我有一个指向我网站上的音乐文件的链接,现在文件的名称在上传时被散列,所以我想使用我存储在数据库中的原始文件名,我做了一些研究并发现'a' 标签的这个新的 'download' 属性,但仅适用于更高版本的 firefox 和 chrome,它在 ie 中不起作用,也不适用于我使用的下载管理器,所以我在网上查了一下,发现关于我然后实施的标题。我现在可以更改文件名,但无论我尝试下载的音乐文件如何,音乐文件都会继续保存为“11.35kb”文件大小。这是我的代码:

if (isset($_REQUEST['download']))
    {
        $download_id = $_REQUEST['download'];

        $db = new MysqliDatabase(ConnectionString);
        $result = array();
        $result = $db->query_one("SELECT TrackID, ma.ArtisteName, FeaturedArtistes, 
                                  mc.Category, TrackName
                                  FROM `musictracks` mt

                                  LEFT JOIN `musiccategories` mc 
                                  ON mt.CategoryID = mc.CategoryID

                                  LEFT JOIN `musicartistes` ma
                                  ON mt.ArtisteID = ma.ArtisteID

                                  WHERE mt.TrackID = '$download_id';");

        $filename = $result->TrackPath;
        $outputfilename = $result->ArtisteName . ' ft. ' . $result->FeaturedArtistes . ' - ' . $result->TrackName . '.mp3';

        header("Content-Type:  audio/mpeg");
        header("Content-Disposition:  attachment; filename=\"" . basename($outputfilename) . "\";" );
        header("Content-Transfer-Encoding:  binary");
        readfile("$filename");
    }

这是下载链接:

<a href="<?php echo 'musicdownload.php?download='. $row->TrackID ?>" ><img src="images/download.png" alt="download" title="download" width="14" height="14" /></a>

【问题讨论】:

  • 11.35kb 文件包含什么?
  • 在服务器上放一些mp3文件并尝试直接下载 - 可能服务器有问题。并检查您的$filename - 也许这不是您所期望的。
  • 它被保存为音乐文件,但是当我尝试播放它时它不起作用。
  • 在记事本中打开这个文件——里面可能是带有错误信息的文本/html
  • 所以请阅读 - 将 .mp3 更改为 .html 并在浏览器中打开。可能有错误信息

标签: php html mysql


【解决方案1】:

我的 PHP 有点生疏了,但我可以用你的代码想到一件事,没有内容长度标题。将您的代码更新为此,看看是否有效:

if (isset($_REQUEST['download'])) {
  {
    $download_id = $_REQUEST['download'];

    // ...

    $filename = $result->TrackPath;
    $outputfilename = $result->ArtisteName . ' ft. ' . $result->FeaturedArtistes . ' - ' . $result->TrackName . '.mp3';

    if (file_exists($filename)) {
      header("Content-Type:  audio/mpeg");
      header("Content-Disposition:  attachment; filename=\"" . basename($outputfilename) . "\";" );
      header("Content-Transfer-Encoding:  binary");

      header('Content-Length: ' . filesize($filename));
      ob_clean();
      flush();
      readfile($filename);
      exit;
    }
  }
}

请注意,在开始下载实际文件之前,我们使用flush(); 将标头发送到浏览器。我还添加了if (file_exists($filename)) 以确保我们有文件要发送。我建议您在此处放置一个 else 子句,以便在您没有预期的文件时向您显示一些内容...

【讨论】:

    【解决方案2】:

    header("Content-Type: application/force-download"); header("Content-Type:audio/mpeg"); header("Content-Type: application/download");; header("Content-Disposition: attachment;filename=".$file_name);

    【讨论】:

      【解决方案3】:

      请使用 curl 下载您的 mp3 文件

      这是供您参考的示例代码

      <?php
      
      if(isset($_REQUEST['inputurl']) && $_REQUEST['inputurl']!="") {
      
      $file = $_REQUEST['inputurl']; 
      
      header("Content-type: application/x-file-to-save"); 
      header("Content-Disposition: attachment; filename=".basename($file)); 
      readfile($file); 
      
      }
      
      ?>
      
      <form name="from" method="post" action="">
      <input name="inputurl" type="text" id="inputurl"  value="" />
      <input type="submit" name="Button1" value="Get File" id="Button1" />
      </form>
      

      也许对你有帮助。

      【讨论】:

        猜你喜欢
        • 2012-02-13
        • 2014-03-04
        • 2012-05-25
        • 2012-01-19
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多