【问题标题】:failed to open stream: Permission denied无法打开流:权限被拒绝
【发布时间】:2014-11-10 17:38:00
【问题描述】:

我正在开发一个带有php 和mysql 和dompdf 的网站,在我的一种形式中,我有一个按钮,该按钮必须生成一个.pdf 文件,然后通过发送电子邮件。 (在我的本地主机上,它可以生成pdf文件,但不发送电子邮件。在我的网络服务器上,我无法创建pdf,但发送电子邮件......)

我看到的消息是:

Warning: file_put_contents(C:/Inetpub/vhosts/.../dompdf/lib/fonts/log.htm) [function.file-put-contents]: failed to open stream: Permission denied in C:\Inetpub\vhosts\...\dompdf\include\dompdf.cls.php on line 864 
//the mistake in in the `dompdf` class

Warning: file_put_contents(pdf/pdfgenerados/cotizacion.pdf) [function.file-put-contents]: failed to open stream: Permission denied in C:\Inetpub\vhosts\...\list.php on line 116

这是我的代码:

$codigoHTML=utf8_decode($codigoHTML);
$dompdf=new DOMPDF();
$dompdf->load_html($codigoHTML);
ini_set("memory_limit","128M");
$dompdf->render();
$pdf = $dompdf->output();

file_put_contents("pdf/pdfgenerados/cotizacionnueva.pdf", $pdf);



echo "Cotización generada";


//<<-------------- Send by email------------>>>

$fileat = "pdf/pdfgenerados/cotizacionnueva.pdf";
$fileat_type="pdf";
$fileatname= "Cotización.pdf";

$emailfrom="my-email@hotmail.es";
$emailsubject="Cotización";
$emailmessage="------------ Here you have the pdf file... have a nice day";
$emailto="other_e-mail@gmail.com";//
$headers = "From: $emailfrom";

$file = fopen($fileat,'rb');   
$data = fread($file,filesize($fileat));   
fclose($file); 

$semi_rand = md5(time());   
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";   


$data = chunk_split(base64_encode($data));   
$data . "nn --{$mime_boundary}--n";   

$ok = @mail($emailto, $emailsubject, $emailmessage, $headers);   

  if($ok) {   
  echo " <br/><font face=verdana size=2>The file was successfully sent!</font>";   
  } else {   
  die("Sorry but the email could not be sent. Please go back and try again!");   
  } 

我收到了电子邮件。但我没有收到pdf。文件

我能做什么???

【问题讨论】:

    标签: php email pdf dompdf


    【解决方案1】:

    这是因为 mPDF 试图在 TTFONTDATA 文件夹中写入临时文件

    你可以通过给TTFONTDATA文件夹写权限0777来解决 或者 通过将 _MPDF_TTFONTDATAPATH 路径更改为 Linux 临时目录 通过在创建 mPDF 实例之前添加以下行

    define('_MPDF_TTFONTDATAPATH', sys_get_temp_dir()."/");

    【讨论】:

    • 问题是 domPdf 而不是 mPDF
    【解决方案2】:

    您可能没有文件夹的访问权限

    pdf/pdfgenerados/
    

    授予对该文件夹以及文件cotizacionnueva.pdf(如果已存在)的读/写权限

    【讨论】:

      【解决方案3】:

      出于安全原因,DOMPDF 无法读取 dompdf 根目录之外的 html 文件。请参见 dompdf_config.inc.php 的第 133 行。您必须使用的路径是 DOMPDF 根目录。

      这将起作用:

        $url = base_path() . '/vendor/dompdf/dompdf/pdfs/email-price-quote.html';
        $dompdf = new Dompdf();
        $dompdf->load_html_file($url);
        $dompdf->render();
      

      【讨论】:

      • 有没有办法做到这一点,同时在供应商文件夹之外维护一个模板文件,这样它就不会在更新时被覆盖/所以不必有两个不同的模板文件,一个 git一个控制一个不控制??
      【解决方案4】:

      我在生产中遇到了类似的 laravel 问题。

      不得不手动设置一些选项:

      App::make('dompdf.wrapper')
      ->setOptions([
        'logOutputFile' => storage_path('logs/dompdf.html'),
        'tempDir' => storage_path('fonts'),
        'isRemoteEnabled' => true
      ])
      

      【讨论】:

        【解决方案5】:
        cd /application/vendor/mpdf/mpdf  
        chmod -R 777 ttfontdata/
        

        【讨论】:

        • 请分享更多细节,以便其他人学习
        • 问题是针对 domPDF 而不是 mpDF
        猜你喜欢
        • 1970-01-01
        • 2020-08-29
        • 2011-06-22
        • 2015-12-16
        • 2015-11-15
        • 2017-09-23
        • 2015-02-01
        • 2014-11-29
        相关资源
        最近更新 更多