无法打开流:权限被拒绝

3
我正在使用 phpmysqldompdf 开发一个网站,在我的一个表单中有一个按钮,这个按钮需要生成一个 .pdf 文件,并将其通过电子邮件发送。(在我的本地主机上,它可以生成 pdf 文件,但无法发送电子邮件。在我的 Web 服务器上,我无法创建 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文件。

我该怎么办?

5个回答

1
这是因为mPDF试图在TTFONTDATA文件夹中写入临时文件。
您可以通过授予TTFONTDATA文件夹写权限0777来解决此问题,或者通过将_MPDF_TTFONTDATAPATH路径更改为Linux临时目录来解决此问题,在创建mPDF实例之前添加以下行:
define('_MPDF_TTFONTDATAPATH', sys_get_temp_dir()."/");

问题是关于domPdf而不是mPDF。 - FabricioG

0

我在 Laravel 生产环境中遇到了类似的问题。

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

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

0
出于安全原因,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控制,一个不受? - movac

0

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

pdf/pdfgenerados/

给予此文件夹读写权限,并且如果cotizacionnueva.pdf已经存在,也要给予其读写权限。


-3
cd /application/vendor/mpdf/mpdf  
chmod -R 777 ttfontdata/

请分享更多细节,以便其他人可以从中学习。 - Nico Haase
问题是关于 domPDF 而不是 mpDF。 - FabricioG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接