web-dev-qa-db-ja.com

PhpSpreadsheet:アクセス許可| ZipArchive :: close():一時ファイルの作成に失敗しました

PhpSpreadsheetでダウンロードするExcelファイルを提供したい

これが私のコードです:

    require 'vendor/autoload.php';

    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->setCellValue('A1', 'Hello World !');

    $writer = new Xlsx($spreadsheet);
    $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');

    header('Content-Type: application/vnd.ms-Excel');
    header('Content-Disposition: attachment; filename="hello_world.xlsx"');
    $writer->save("php://output");

次のエラーメッセージが表示されます。

    PHP Warning:  ZipArchive::close(): Failure to create temporary file: No such file or directory in /Users/sg/GitWorkingCopies/xxx1/xxx2/library/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 374
    PHP Fatal error:  Uncaught exception 'PhpOffice\PhpSpreadsheet\Writer\Exception' with message 'Could not close Zip file php://output.' in /Users/sg/GitWorkingCopies/xxx1/xxx2/library/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php:375

PHPSpreadsheetの解説 はこう言っています:

\ PhpOffice\PhpSpreadsheet\Writer\Xlsxは、php:// outputへの書き込み時に一時ストレージを使用します。デフォルトでは、一時ファイルはスクリプトの作業ディレクトリに保存されます。アクセスがない場合、オペレーティングシステムの一時ファイルの場所にフォールバックします。

Upload_tmp_dirは次のとおりです:/Applications/XAMPP/xamppfiles/temp/

確認する必要があるフォルダの権限は何ですか?または何が問題の原因ですか?

4
Phantom

PHPにあるディレクトリに書き込むための一般的な規則:

存在する必要があります

それはPHP process

open_basedir php.iniディレクティブで許可されています

したがって、$writer->save()メソッドの引数としてファイルパスを設定し、これら3つのルールが満たされていることを確認します。

$writer->save()メソッドで_php://output_値または_php://stdout_値のみを使用する場合は、次のルールを確認してください。

1)sys_get_temp_dir()関数によって返されるディレクトリ。 Windowsでは、sys_get_temp_dir()はデフォルトで現在のOSユーザーの一時ディレクトリを返します。値は_sys_temp_dir_ php.iniディレクティブで変更できます。

または

2) pload_tmp_dir php.iniディレクティブによって返されるディレクトリ。 _$useUploadTempDirectory_には、デフォルトでfalse値があります。値をtrueに設定するには、ファイルを保存する前に、次の行をコードに追加します。

\PhpOffice\PhpSpreadsheet\Shared\File::setUseUploadTempDirectory(true);


保存パスを選択するコードは次のとおりです。

_\PhpOffice\PhpSpreadsheet\Writer\Xlsx::save_メソッドから( ソース ):

_// If $pFilename is php://output or php://stdout, make it a temporary file...
$originalFilename = $pFilename;
if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') {
    $pFilename = @tempnam(File::sysGetTempDir(), 'phpxltmp');
    if ($pFilename == '') {
        $pFilename = $originalFilename;
    }
}
_

_\PhpOffice\PhpSpreadsheet\SharedFile::sysGetTempDir_メソッドから( ソース ):

_/**
 * Get the systems temporary directory.
 *
 * @return string
 */
public static function sysGetTempDir()
{
    if (self::$useUploadTempDirectory) {
        //  use upload-directory when defined to allow 
        // running on environments having very restricted open_basedir configs
        if (ini_get('upload_tmp_dir') !== false) {
            if ($temp = ini_get('upload_tmp_dir')) {
                if (file_exists($temp)) {
                    return realpath($temp);
                }
            }
        }
    }
    return realpath(sys_get_temp_dir());
}
_

あなたのコードがインクルードされたファイルからのものかどうかはわかりませんが、同様の問題がありました。私は__DIR__定数を使用しようとしましたが、うまくいきました、私のコードは次のようになります:

$filepath = __DIR__ . "/reports/${filename}_".date("Ymd_Gis").".xlsx";
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save($filepath);
0
Szél Lajos

問題はphpSpreadSheetによって使用されたtmpディレクトリであり、PHPプロセスによって書き込み可能ではありませんでした。tmpディレクトリを変更してtmpディレクトリをアップロードしました。これで問題は解決しました。問題を解決するには、

\PhpOffice\PhpSpreadsheet\Shared\File::setUseUploadTempDirectory(true);
0
monsur.hoq