【问题标题】:use PHP ZipArchive with file as variable使用 PHP ZipArchive 和文件作为变量
【发布时间】:2017-04-14 23:06:51
【问题描述】:

在 symfony 控制器中,我有一个文件(UploadedFile 对象)作为变量。

我想用 php ZipArchive 打开这个“变量”,然后解压它。 但是 open() 方法需要一个字符串,它是文件系统中的文件名。有没有什么方法可以用 ZipArchive 处理文件而不将文件变量写入 FS?

【问题讨论】:

  • 我认为没有办法使用 ZipArchive 类处理内存中的 zip 文件。您始终可以将文件保存在 tmp dir.. -> sys_get_temp_dir()
  • 谢谢,我去看看

标签: php file symfony variables php-zip-archive


【解决方案1】:

您可以使用tmpfile() 创建一个临时文件,写入该文件,然后在压缩包中使用它。示例:

<?php

$zip = new ZipArchive();
$zip->open(__DIR__ . '/zipfile.zip', ZipArchive::CREATE);

$fp = tmpfile();
fwrite($fp, 'Test');
$filename = stream_get_meta_data($fp)['uri'];

$zip->addFile($filename, 'filename.txt');
$zip->close();

fclose($fp);

【讨论】:

    【解决方案2】:

    小改进:

    $zipContent; // in this variable could be ZIP, DOCX, XLSX etc.
    
    $fp = tmpfile();
    fwrite($fp, $zipContent);
    $stream = stream_get_meta_data($fp);
    $filename = $stream['uri'];
    
    $zip = new ZipArchive();
    $zip->open($filename);
    // profit!
    $zip->close();
    fclose($fp);
    

    创建“zipfile.zip”并在其中添加文件是没有意义的,因为我们已经有了一个变量。

    【讨论】:

      【解决方案3】:

      https://stackoverflow.com/a/53902626/859837查看这个答案

      有一种方法可以创建仅驻留在内存中的文件。

      【讨论】:

        猜你喜欢
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 2016-07-17
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 2020-09-05
        • 2016-05-17
        相关资源
        最近更新 更多