【问题标题】:Download function doesn't work下载功能不起作用
【发布时间】:2023-03-15 09:55:01
【问题描述】:

我的下载功能有问题。 在我的系统中,我喜欢进行安全下载。 我的根目录下的文件无法通过 url 访问。 我将ftp权限设置为700。只有服务器可以访问。 之后,我制作了一个可以为用户下载文件的功能。 那时我可以对 session 进行安全检查。

但是,当服务器通过此代码下载文件时,该文件会在浏览器中打开。 使用exe,浏览器显示奇怪的字母。

  // Bestandsnaam
            $file = 'bestanden/test.exe';

            // Ophalen bestand
            if (file_exists($file)) {
                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename='.basename($file));
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                header('Pragma: public');
                header('Content-Length: ' . filesize($file));
                ob_clean();
                flush();
                readfile($file);
                exit;
            }

当用户访问网址时,我想要一个另存为框。

我想这样使用这个功能:

<a href="www.site.nl/downloadfunction/file">download</a>

有人有解决办法吗?我尝试了 Javascript document.execCommand('SaveAs',null,bestand); 而不是 readfile 但它在 Firefox 中不起作用。

感谢您的帮助!

【问题讨论】:

  • 你有这个功能的else部分吗?还要检查文件的路径是否正确,文件是否有被获取的权限。
  • readfile 是 PHP,execCommand 是 JavaScript。你不能直接交换它们。 execCommand('save' 也只是 IE,所以这不是一个很好的解决方案。

标签: php javascript codeigniter http-headers download


【解决方案1】:

尝试将ob_clean 放在标题上方。如果这些标头在您当前的代码中成功发送,我什至怀疑您是否需要 ob_clean。

【讨论】:

    【解决方案2】:

    您可以在标头功能之前的输出中包含一些字符,因为代码看起来是正确的。在这种情况下,您还应该将error_display 设置为关闭,否则您应该会收到警告。

    if 之后使用headers_sent 函数检查。

    【讨论】:

      【解决方案3】:

      使用download helper

      function process($file)
      {
          $this->load->helper('download');
          $data = file_get_contents("my-downloads/$file"); // Read the file's contents
          force_download($file, $data);            
      }
      

      应注意您需要处理的细节(标题、mime 类型检测)。

      source is available,如果您对详细信息感兴趣。

      【讨论】:

      • 不额外指定其他HTTP头,你会得到一个“未知格式”的附件。
      • @toopay:下载助手会处理这个问题。
      • 不额外指定其他 HTTP 标头并验证文件是否存在,您将获得“未知格式”附件。
      • 好吧,如果您打开不存在的文件,这从代码中很明显。关于文件扩展名,您应该配置您的 codeigniter mime-types,以防它尚未包含。否则它将作为二进制文件提供,这通常很好。
      • 我实际上同意使用下载助手,这实际上使它更简单(注意他们应该确保 mime-types 在他们的 mimes.php/config 文件夹中)。但至少在上面的代码中提供一个简单的验证。或者你会给他另一个问题,而不是一个“更聪明”的解决方案。
      【解决方案4】:

      我使用完全相同的代码,它运行良好。

      但是,客户端做什么取决于浏览器参数。如果文件类型在您的浏览器中设置为“始终打开”,并且默认下载操作是“无需询问即可下载”,它将 1) 将文件下载到您的默认下载文件夹中,然后 2) 打开它。您只需选中“下载前询问每个文件的保存位置”即可获得该框。

      【讨论】:

      • 嗯,问题解决了。文件已损坏。很奇怪的问题。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多