【问题标题】:Attempting to force download via PHP试图通过 PHP 强制下载
【发布时间】:2021-10-09 16:01:24
【问题描述】:

我有一个 PDF 文件存储在 Wordpress 堆栈的上传目录中。我正在尝试强制浏览器通过 AJAX 下载 PDF。

    function get_pdf(){
    
      $file_path = realpath(WP_CONTENT_DIR).'/uploads/pdfs/12345.pdf';
    
        if (file_exists($file_path)) {
      
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file_path));
            readfile($file_path, true);
                    
            exit;
           
        }
    
    }

当我运行这个函数时,什么也没有发生。我也尝试过这种方法来触发下载:

    if (file_exists($file_path)) {


      $handle = fopen($file_path, 'rb');
      $buffer = '';

      while (!feof($handle)) {
        $buffer = fread($handle, 4096);
        echo $buffer;
        ob_flush();
        flush();
      }

      fclose($handle);
        

    }

关于如何调试它以使其正常工作的任何建议?

【问题讨论】:

  • header('Content-Type: application/octet-stream'); — PDF 文件的 Content-Type 是 application/pdf。如果你知道得更多,你不应该说它只是一些字节。

标签: php wordpress download fopen readfile


【解决方案1】:

当浏览器导航到某个 URL 时,响应将内嵌显示(即在浏览器窗口中)或保存。发生哪种情况取决于文件类型和Content-Disposition 标头的组合。

当浏览器使用 Ajax 请求数据时,响应将由发出请求的 JavaScript 处理

响应标头(或有关响应的任何其他内容)无法使 JavaScript 保存文件,而不是将其传递给 JavaScript 进行处理。

可以编写 JavaScript 以注意 Content-Disposition 标头,但一般来说,JS 的作者不需要使用这样的标头来决定如何处理文件。

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多