web-dev-qa-db-ja.com

mPDF一時ファイルはYii

PDFで証明書を印刷しようとしましたが、コードをステージングにプッシュすると、

Temporary files directory "/var/www/protected/vendor/mpdf/mpdf/src/Config/../../tmp" is not writable

権限を変更する方法とカスタムディレクトリを変更する方法がわかりません。

証明書を取得するためにクリックするボタンのコードは次のとおりです。

 <a class="btn btn-sd btn-sd-ghost btn-sd-ghost-black margin-right-lg" href="<?php echo $this->createUrl('//idea/frontend/pdf', array('id'=>$model->id))?>" target="_blank">Get Your Certificate<i class="icon-right-small"></i></a> 
            <?php endif; ?>

これがコントローラーです。

public function actionPdf($id){
        $model = HUB::getOrganization($id);
        $orgtitle = $model->title;

        $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4-L']);
        $mpdf->WriteHTML("<html><body style='background-image:url(\"/images/cert-idea.jpg\"); background-image-resize: 5; background-position: top center;'></body></html>");

        $mpdf->WriteHTML("<div style='text-align:center; display:table; height:100%; width:100%; padding-top:28%;'><h1 style='display:table-cell; vertical-align:middle; font-size:40px;'>".$orgtitle."</h1></div>");


        $mpdf->Output('IDEA-CERT-'.$orgtitle.'.pdf', 'I');
    }

誰かが私の問題を手伝ってくれることを願っています。ありがとうございました!

4
rryys

ドキュメント に記載されているカスタム一時ディレクトリを試してください。

tempDir構成キーを使用してカスタム一時ディレクトリを設定することをお勧めします。ディレクトリには書き込み権限が必要です(モード775をお勧めします)。

<?php
$mpdf = new \Mpdf\Mpdf(['tempDir' => __DIR__ . '/custom/temp/dir/path']);

composer vendor-dirの外部のディレクトリのパーミッションをはるかに細かく制御できます。

Webサーバーユーザー(通常はwww-data)がディレクトリにアクセスする必要がある場合、モード775では不十分な場合があります。必要に応じて777を使用してください。

MPDFは一時ディレクトリを自動クリーニングするため、mPDF専用のディレクトリを使用してください。

4
Finwe

次の方法でファイルのアクセス許可を変更できます。
chmod 777 /var/www/protected/vendor/mpdf/mpdf/tmp
しかし、それはそのコンピュータanyanyoneを許可しますそのファイルへのアクセスの種類なので、おそらく良い考えではありません。ただし、これが機能する場合は、問題がファイルのアクセス許可にあることがわかっているので、出発点になります。

そのファイルの所有者でない場合は、スーパーユーザーとして実行する必要がある場合があります

より良い解決策は、所有者をサーバーが実行されるプロセスに変更することです。
chown www-data: /var/www/protected/vendor/mpdf/mpdf/tmp
ファイルを保存するプロセスのwww-dataを変更します。

PDFをそのディレクトリに保存しようとしているのは奇妙ですが、KartikのmPDFを使用していますか?デフォルトの構成では、ファイルをブラウザーにインラインで送信します。グローバルに、またはウィジェットの作成時に構成を次のように変更した場合にのみ、ファイルを保存しようとします。

'destination' => ['Pdf::DEST_FILE', '../../tmp']

その場合は、必要なオプション、おそらくPdf::DEST_BROWSER(デフォルト)またはPdf::DEST_DOWNLOADに設定して、ユーザーにプロンプ​​トを表示せずにダウンロードを強制するのが最善です。

開発中のコンピューターをクライアントとして使用することだけを計画している場合を除いて、アプリケーションが存在するディレクトリ内にPDFをファイルとして保存することは、実際には意味がありません。他のクライアントのフォルダー構造がどのようになるかを判断する方法はありません。ブラウザにファイルの処理方法を決定させる方がはるかに優れています。

2
Raul Sauco

書き込み可能な一時ディレクトリを提供することが不可欠です。最善の解決策は、OSが提供する一時スペースを使用することです。

$mpdf = new \Mpdf\Mpdf(['tempDir' => sys_get_temp_dir().DIRECTORY_SEPARATOR.'mpdf']);
0