【问题标题】:Cannot download generated PDF file hosted in xampp无法下载在 xampp 中托管的生成的 PDF 文件
【发布时间】:2015-11-12 08:56:30
【问题描述】:

我决定问这个问题,因为这让我发疯,我不知道该怎么办,因为我尝试了我能想到的一切。

我正在用 laravel 构建一个网络工具。有一个选项可以生成一些 pdf 格式的报告,这就是我的问题开始的时候。

我构建这个 pdf 文件的功能是。

public function generarPDF() {

        $inicio = Input::get('inicio');
        $fin = Input::get('fin');

        $datos = $this->datosInforme($inicio, $fin);

        $html = View::make('reportes.pdf', array('datos' => $datos,
                                                   'inicio'=> $inicio,
                                                   'fin' => $fin));

        return $html;

    }

    public function descargarArchivoPDF() {

        $inicio = Input::get('inicio');
        $fin = Input::get('fin');

        $nombreArchivo = storage_path().'/pdf/report-'.(new DateTime())->format('Y-m-d').'.pdf';

        if (file_exists($nombreArchivo)) {
            unlink($nombreArchivo);
        }

        $command = 'wkhtmltopdf -O Landscape -s A4 -T 25 -R 20 -B 25 -L 20 "';

        $url = url('/generar-pdf-reporting');
        $argumentos = array();

        if (!empty($inicio)) {
            $argumentos[] = 'inicio='.$inicio;
        }

        if (!empty($fin)) {
            $argumentos[] = 'fin='.$fin;
        }

        if (count($argumentos) > 0) {
            $argumentos = '?'.implode('&', $argumentos);
        }
        else {
            $argumentos = '';
        }

        $url .= $argumentos;

        $command .= $url.'" '.$nombreArchivo;

//        return $command;

        $process = new Symfony\Component\Process\Process($command);

        $process->run();

        if (!$process->isSuccessful()) {
            throw new Symfony\Component\Process\Exception\ProcessFailedException($process);
        }
        else {
            return Response::download($nombreArchivo);
        }

    }

generarPDF 函数只是构建一个视图,该视图将是 pdf 文件的内容。

文件创建成功,但是当我尝试下载它时,我无法下载,因为(根据 chrome)存在网络错误。

奇怪的是在我的 linux 机器上一切正常,它不使用 xampp,而是从存储库安装的 apache+php+mysql。

如果我删除了构建文件的代码并只留下一个下载以前创建的文件,那么工作完美无缺,我认为这可能是 Symfony 进程异步运行的问题,所以让它等到完成但没有运气。

xampp 安装在 Windows 8 服务器中。

我不知道我还能做什么。会不会是 xampp 的 bug?

【问题讨论】:

  • 它是否抛出任何异常或您在 error.log 中找到任何内容?
  • 什么都没有。一切似乎都运作良好。真的很奇怪。
  • 您是存储生成的 pdf 并将链接指向它以下载还是仅生成生成和下载 pdf 的链接?
  • 当我点击按钮生成pdf文件时,该函数会创建文件,然后让浏览器下载它。这就是我使用“return Response::download()”函数的原因。
  • 为什么不能生成指向生成的 pdf 的成功事件链接?

标签: php symfony laravel pdf


【解决方案1】:

这是合乎逻辑的方式,我将如何处理它

第一步:首先要有这样的链接

yourapp/generatepdf/14

应该是这样的点击这里

如果你直接指向一个文件

点击这里

即,14 是您传递的参数

第 2 步:在控制器内部

根据输入参数生成/输出一个pdf

第 3 步:因此,一旦打开链接,它将根据您的参数生成并下载 pdf

希望对你有帮助

【讨论】:

    【解决方案2】:

    您是否尝试将 http 标头放入文件中?

    PHP manual 中提到的 http 标头,

    你可以试试这个:

    <?php
    // We'll be outputting a PDF
    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');
    ?>
    

    我不确定标头是否已经存在于您的代码中,CMIIW :-)

    【讨论】:

    • 我也尝试发送标题和读取文件。我认为这与 windows 上的 xampp 有关。
    【解决方案3】:

    试试这个...

    $filename=$_SERVER['DOCUMENT_ROOT']."/dirctory/your.pdf";
    $realname="filename.pdf";
    if (file_exists($filename))
        {
            // send headers to browser to initiate file download
            header('Cache-control: private');
            header ('Content-Type: application/pdf');
            header ('Content-Disposition: attachment; filename="' . $realname . '"');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            readfile($filename);
    
        }
    

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2021-08-05
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      相关资源
      最近更新 更多