天道酬勤,学无止境

PHP ZipArchive dont support UTF8 files for open

PHP ZipArchive dont support UTF8 files for open

my problem is OPEN files with UTF8 name. ZipArchive dont open files with UTF8 character. i dont add new file i need only open file.

php: 5.6 and Use Yii2.

code:

$path = "files/تست تست.zip";
        $zip = new \ZipArchive();
        if($zip->open($path) === true) {

            return "File opened";
        }
        else
        {
            return "File could not be opened";
        }

评论

Sorry about marking this as a duplicate for an unrelated issue.

I'm able to open UTF-8 zip files without a problem using PHP 5.6.

This code will create a new ZIP file with that filename without a problem, with a "test.txt" file in it:

$path = "تست تست.zip";
$zip = new ZipArchive();

if($zip->open($path, ZipArchive::CREATE) === true) {
    echo "File opened\n";
    $zip->addFromString("test.txt", "Test file");
    $zip->close();
} else {
    echo "File could not be opened";
}

This code will open an existing ZIP file with that name and print out the first filename from within the archive:

$path = "تست تست.zip";
$zip2 = new ZipArchive();

if($zip2->open($path) === true) {
    echo "File opened\n";
    echo $zip2->getNameIndex(0);
    $zip2->close();
} else {
    echo "File could not be opened";
}

These examples work fine in the PHP Sandbox and on phptester.com (no direct link available). I tried it on 3v4l.org as well, but they don't have the php-zip extension enabled so ZipArchive is not available there.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • PHP支持多格式的解压缩工具类
    一、 引语 本人在做一个企业云盘项目当中,遇到一个文件在线解压缩的需求,查了网上很多资料,但都是只支持单一格式或部分格式,固创建了本工具类,对市面上主流的压缩格式进行集成支持,并且简单易用。 二、 功能 支持zip、rar、phar、tar、gz、bz2、7z格式的解压 支持对单文件、多文件、文件夹进行压缩成zip文件格式数据库连接池 三、 前置条件 安装php_zip插件:用于解压缩zip格式文件 安装php_rar插件:用于解压缩rar格式文件 安装php_phar插件:用于解压缩phar、tar、gz、bz2格式文件 安装p7zip p7zip-full软件:用于解压缩7z格式文件 四、 实现 class ZipUtil { /** * 解压 * @param string $zipFilePath 压缩文件路径 * @param string $toDirPath 解压目录路径 * @return string * @throws \Exception */ public static function extract(string $zipFilePath, string $toDirPath) { $toDirPath = rtrim($toDirPath, '/'); self::deleteDir($toDirPath, false); if (!is_file(
  • 如何使用PHP压缩整个文件夹(How to zip a whole folder using PHP)
    问题 我在stackoveflow上找到了一些关于如何压缩特定文件的代码,但是特定文件夹又如何呢? Folder/ index.html picture.jpg important.txt 在“ My Folder ,有文件。 在压缩“ My Folder ,我还想删除该文件夹的全部内容,但important.txt的.txt文件除外。 在堆栈中找到这个 我需要你的帮助。 谢谢。 回答1 代码已于2015/04/22更新。 压缩整个文件夹: // Get real path for our folder $rootPath = realpath('folder-to-zip'); // Initialize archive object $zip = new ZipArchive(); $zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE); // Create recursive directory iterator /** @var SplFileInfo[] $files */ $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator
  • 致命错误:找不到类“ ZipArchive”(Fatal error: Class 'ZipArchive' not found in)
    问题 我有一个问题,我在Linux服务器上安装了“ Archive_Zip 0.1.1”,但是当我尝试运行脚本来创建zip文件时,却出现了致命错误 致命错误:在...中找不到类ZipArchive 我把代码放在哪里 $zip = new ZipArchive; var_dump($zip); $res = $zip->open($filename, ZipArchive::OVERWRITE); if ($res !== TRUE) { echo 'Error: Unable to create zip file'; exit; } if (is_file($src)) { $zip->addFile($src); } else { // echo "<br>" . dirname(__FILE__) . $src;//'/install1'; if (!is_dir($src)) { $zip->close(); @unlink($filename); echo 'Error: File not found'; exit; } recurse_zip($src, $zip, $path_length); } $zip->close(); echo "<br>file name ".$filename; 但找不到类文件。 请告诉我解决方案。 我该怎么办才能解决问题? 我还将php
  • 从字节(具有任意编码的文本)在内存中创建 zip 文件(Create zip file in memory from bytes (text with arbitrary encoding))
    问题 我正在开发的应用程序需要将 xml 文件压缩为 zip 文件,并通过 http 请求将它们发送到 Web 服务。 由于我不需要保留 zip 文件,我只是在内存中执行压缩。 Web 服务拒绝了我的请求,因为 zip 文件显然格式不正确。 我知道在这个问题中有一个完美的解决方案,但它使用了StreamWriter 。 我对该解决方案的问题是StreamWriter需要编码或假定为UTF-8 ,并且我不需要知道 xml 文件的编码。 我只需要从这些文件中读取字节,并将它们存储在一个 zip 文件中,无论它们使用什么编码。 所以,要清楚,这个问题与编码无关,因为我不需要将字节转换为文本或对立。 我只需要压缩一个byte[] 。 我正在使用下一个代码来测试我的 zip 文件是如何畸形的: static void Main(string[] args) { Encoding encoding = Encoding.GetEncoding("ISO-8859-1"); string xmlDeclaration = "<?xml version=\"1.0\" encoding=\"" + encoding.WebName.ToUpperInvariant() + "\"?>"; string xmlBody = "<Test>ª!\"·$%/()=?¿\\|@#~€¬'¡º</Test>
  • php zip 内容编码(php zip contents encoding)
    问题 我使用 UTF-8 编码通过 php 脚本创建了一些 .txt 文件(带有希腊字符)。 当我尝试从 ftp 下载和读取这些文件时,一切正常(没有编码问题)。 当我将这些文件压缩到 zip 存档时,我面临所有希腊字符和 newLines 字符的编码问题。 压缩脚本: $zip = new ZipArchive(); $filename = "my_zip.zip"; if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) { exit("cannot open <$filename>\n"); } $files = glob('users/'.$_SESSION['s_uid'].'/*'); // get all file names foreach($files as $file){ // iterate files if(is_file($file)) //$zip->addFile($thisdir . $file, basename($file)); $zip->addFile($thisdir . $file, iconv("UTF-8","UTF-8", basename($file))); //echo $file; // delete file } $zip->close(); 回答1 这似乎是 PHP
  • PHP中的zipArchive打开错误(zipArchive open error in PHP)
    问题 无法在 PHP 中创建 zip 存档,总是返回ZIPARCHIVE::ER_MULTIDISK $fileName=$_SERVER['DOCUMENT_ROOT'].'/temp/temp.zip'; $zip = new ZipArchive(); $err=$zip->open($fileName,ZipArchive::CREATE); $zipFileFunctionsErrors = array(0=>'OK', ZIPARCHIVE::ER_MULTIDISK => 'Multi-disk zip archives not supported.', ..., ... ); echo $zipFileFunctionsErrors[$err]; $zip->addFromString('empty.txt', ''); $zip->close(); 输出 Multi-disk zip archives not supported 未创建 zip 文件 在本地机器代码上运行良好 回答1 我认为您的问题必须与 php 版本有关,听起来是这样的:(来自 php.net 评论): 如果 zip_open 失败,一些较旧的 PHP 版本过去常常返回 false,而较新的版本返回错误数(作为整数),而不是这样: $zip = zip_open($zip_file); if (
  • 通过 PHP 上传 ZIP 文件和解压缩 ftp 文件夹(Upload a ZIP file and UNZIP ftp folder via PHP)
    问题 我想制作一个表格,您可以在其中填写 FTP 登录服务器并获得上传 ZIP 文件的选项。 该脚本与最后一部分(解压缩文件)分开工作,我想执行解压缩上传的文件。 有谁知道是什么问题? TIA <?php if (isset($_POST['Submit'])) { $ftp_server = $ftp = $_POST['ftp']; $ftp_user_name = $username = $_POST['username']; $ftp_user_pass = $password = $_POST['password']; if (!empty($_FILES['upload']['name'])) { $ch = curl_init(); $file1 = $localfile = $_FILES['upload']['name']; $fp = fopen($file1, 'r'); $file = '/htdocs/file.zip'; // set up basic connection $conn_id = ftp_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
  • 如何使用PHP创建zip文件(How to create a zip file using PHP)
    问题 我正在尝试将文件从一个文件夹保存到另一个文件夹。 zip文件夹放置在其他目录中。 而且我编写了以下代码: archive.php <?php $zip = new ZipArchive(); $zip->open('example.zip', ZipArchive::CREATE); $srcDir = "/home/sam/uploads/"; $files= scandir($srcDir); //var_dump($files); unset($files[0],$files[1]); foreach ($files as $file) { $zip->addFile("{$file}"); } $zip->close(); ?> 但是可惜我无法创建.zip文件夹。 我错过了任何一步吗? 回答1 $zip = new ZipArchive(); $DelFilePath="first.zip"; if(file_exists($_SERVER['DOCUMENT_ROOT']."/TEST/".$DelFilePath)) { unlink ($_SERVER['DOCUMENT_ROOT']."/TEST/".$DelFilePath); } if ($zip->open($_SERVER['DOCUMENT_ROOT']."/TEST/".$DelFilePath
  • 无需导入和导出文件即可展开存档(Expand-Archive without Importing and Exporting files)
    问题 使用.zip文件 ( Expand-Archive ) 时,如何停止导出然后将文件导入和导出 Powershell? 我目前正在使用一个临时文件夹来提取.zip文件。 是否有一个变量或我遗漏的东西比下面的解决方案更有效? $filename = 'foobar' $Zip_in_Bytes | Set-Content -Encoding Byte -Path "C:\temp\filename.zip" Expand-Archive -Path "C:\temp\filename.zip" -DestinationPath "C:\temp\" -Force [xml]$xml = Get-Content -Path "C:\temp\filename.xml" Remove-Item "C:\temp\filename.zip" Remove-Item "C:\temp\filename.xml" Expand-Archive只支持路径参数,不支持对象 有没有更好的方法来处理.zip文件? 回答1 使用 System.IO.Compression 您可以处理字节数组和流而不是临时文件,但它比Expand-Archive工作量多一些。 编辑:添加了Get-ZipEntryContent和Add-ZipEntry示例调用,并调整了使$ZipFilePath可选的参数。 @(
  • PDF in PHP ZipArchive throwing errors, server permissions [closed]
    Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers. Want to improve this question? Update the question so it's on-topic for Stack Overflow. Closed last month. Improve this question I am collecting a number of files from the server and generating a ziparchive with PHP. All goes super well until I download the zip archive and try to open the file. The reader throws an exception "File type plain text document (text/plain) is not supported". The file is named correctly (c102.pdf). I presume the mime type of the file is getting messed up some how
  • zipArchive open error in PHP
    Cannot create zip archive in PHP, always returns ZIPARCHIVE::ER_MULTIDISK $fileName=$_SERVER['DOCUMENT_ROOT'].'/temp/temp.zip'; $zip = new ZipArchive(); $err=$zip->open($fileName,ZipArchive::CREATE); $zipFileFunctionsErrors = array(0=>'OK', ZIPARCHIVE::ER_MULTIDISK => 'Multi-disk zip archives not supported.', ..., ... ); echo $zipFileFunctionsErrors[$err]; $zip->addFromString('empty.txt', ''); $zip->close(); Outputs Multi-disk zip archives not supported zip file didn't created on local machine code works good
  • Google 应用引擎 php zip 扩展(Google app engine php zip extension)
    问题 我正在使用 Google 应用引擎,我想使用当前版本支持的 zip 扩展名创建一个 zip 存档。 问题是每次我调用 ZipArchive::close 时它都会返回 false 并且 ZipArchive::getStatusString 返回“无法创建临时文件:只读文件系统”。 我正在云存储中创建 zip 文件,如下所示: $zip = new ZipArchive(); $zip->open("gs://whatever/somethig.zip", ZipArchive::OVERWRITE); //returns true $zip->addFromString('file.txt', "some random data"); //returns true $zip->numFiles; // = 1 $zip->close(); // returns false $zip->getStatusString(); //returns Failure to create temporary file: Read-only file system 它应该是可写的,它实际上是与 file_set_content 或其他什么的。 我尝试了相同的代码,但有几个变化: 已经存在的 zip 文件; 不存在的 zip 文件; ZipArchive::CREATE 作为
  • PHP ZipArchive 中的 PDF 抛出错误,服务器权限 [关闭](PDF in PHP ZipArchive throwing errors, server permissions [closed])
    问题 关闭。 此问题不可重现或由拼写错误引起。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 上个月关闭。 改进这个问题 我正在从服务器收集一些文件并用 PHP 生成一个 ziparchive。 一切都很顺利,直到我下载了 zip 存档并尝试打开文件。 阅读器抛出异常“不支持文件类型纯文本文档(text/plain)”。 文件命名正确 (c102.pdf)。 我认为文件的 mime 类型在某种程度上被弄乱了,但我不太确定。 php 版本 5.4.37 我应该注意,我在本地使用 ubuntu 14.04,我的阅读器是默认的文档查看器,但是,它确实在上传之前正确读取了文件。 跟进 - 这可能是权限问题吗? “下载”目录设置为 777,而在其中创建的新 zip 文件为 644。就好像“空白”文件被放置在 zip 存档中一样(zip 的总大小为 1.6k,应该至少为几百)。 另一个后续 - 以下以前的帖子讨论了 chmod 问题 PHP:生成的 zip 具有 chmod 644 以及如何将 777 权限设置为 zip 文件? . 但是 chmod() 方法对我不起作用 - chmod() 无法在服务器上执行(我修改了下面的代码)。 我们将看看技术支持怎么说。 在这种情况下回答...... 在与客户支持交谈后 -
  • Google app engine php zip extension
    I am using Google app engine and I want to create a zip archive using the zip extension which is supported in the current version. The problem is that every time i call ZipArchive::close it returns false and ZipArchive::getStatusString returns "Failure to create temporary file: Read-only file system". I am creating the zip file in the cloud storage like this: $zip = new ZipArchive(); $zip->open("gs://whatever/somethig.zip", ZipArchive::OVERWRITE); //returns true $zip->addFromString('file.txt', "some random data"); //returns true $zip->numFiles; // = 1 $zip->close(); // returns false $zip-
  • 从ZIP字符串中提取文件(Extract a file from a ZIP string)
    问题 我有一个包含一个单个XML文件的zip文件的BASE64字符串。 关于如何无需处理磁盘上的文件就可以获取XML文件内容的任何想法? 我非常希望将整个过程保留在内存中,因为XML只有1-5k。 必须编写zip,提取XML,然后加载并删除所有内容,这会很烦人。 回答1 经过数小时的研究,我认为没有临时文件就无法处理zip: php://memory的第一次尝试将不起作用,因为它是无法被file_get_contents()或ZipArchive::open()类的函数读取的流。 在注释中是缺少此问题文档的php-bugtracker链接。 带有::getStream()的流支持ZipArchive ,但如手册中所述,它仅支持对打开的文件进行读取操作。 因此,您不能用它来快速建立存档。 zip://包装器也是只读的:使用fopen()包装器创建ZIP文件我还尝试了其他类似php wrapper / protocolls的方法 file_get_contents("zip://data://text/plain;base64,{$base64_string}#test.txt") $zip->open("php://filter/read=convert.base64-decode/resource={$base64_string}") $zip->open("php:/
  • Windows 中的 PHP ZipArchive 损坏(PHP ZipArchive Corrupt in Windows)
    问题 我正在使用 PHP 的 ZipArchive 类创建一个包含照片的 zip 文件,然后将其提供给浏览器以供下载。 这是我的代码: /** * Grabs the order, packages the files, and serves them up for download. * * @param string $intEntryID * @return void * @author Jesse Bunch */ public static function download_order_by_entry_id($intUniqueID) { $objCustomer = PhotoCustomer::get_customer_by_unique_id($intUniqueID); if ($objCustomer): if (!class_exists('ZipArchive')): trigger_error('ZipArchive Class does not exist', E_USER_ERROR); endif; $objZip = new ZipArchive(); $strZipFilename = sprintf('%s/application/tmp/%s-%s.zip', $_SERVER['DOCUMENT_ROOT'], $objCustomer
  • 压缩文件并在 PHP 中使用密码进行保护(ZIP a file and protect with a password in PHP)
    问题 我有这个代码来压缩文件,但我需要用密码保护这个文件 $file = 'backup.sql'; $zipname = $file.'.zip'; $zip = new ZipArchive; $zip->open($zipname, ZipArchive::CREATE); ZipArchive::setPassword('123456'); //$zip->setPassword("123456"); $zip->addFile($file); $zip->close(); 当我使用 $zip->setPassword 时,我没有收到任何错误,但文件根本没有受到保护,当我使用 ZipArchive::setPassword 时,我收到此错误“致命错误:非静态方法 ZipArchive::setPassword() 不能静态调用” 那么如何在php中压缩文件并用密码保护它呢? 回答1 是的,不支持创建受密码保护的档案(它们将被简单地创建为不受保护的档案)。 但是,它仍然可以用于提取受密码保护的档案。 回到问题。 你总是可以 <?php echo system('zip -P pass file.zip file.txt'); ?> (这适用于 Windows 和我们心爱的 Linux) 但是,如果它不符合您的要求,让我们继续。 我建议您使用 DotNetZip(仅限
  • iPhone解压码(iPhone Unzip code)
    问题 确实停留在尝试编写代码来解压缩iPhone上的文件或目录的过程中。 以下是一些用于尝试解压缩简单文本文件的示例代码。 它解压缩该文件,但它已损坏。 (void)loadView { NSString *DOCUMENTS_FOLDER = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString *path = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"sample.zip"]; NSString *unzipeddest = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"test.txt"]; gzFile file = gzopen([path UTF8String], "rb"); FILE *dest = fopen([unzipeddest UTF8String], "w"); unsigned char buffer[CHUNK]; int uncompressedLength = gzread(file, buffer, CHUNK); if(fwrite(buffer, 1, uncompressedLength, dest) !=
  • 上载文件名中的UTF-8字符会在上载文件时混乱(UTF-8 characters in uploaded file name are jumbled on file upload)
    问题 我在IIS7上运行系统。 页面META标签的编码为UTF-8,根据Chrome菜单的实际编码看起来是相同的。 当我上传文件名时带有“长连字符”(“ –”)的文件时,它将转换为垃圾字符(“—”)。 垃圾字符保存在MySQL中,服务器上文件的文件名也包含垃圾字符。 但是,当我从数据库中提取文件名并使用PHP显示它时,它将显示正确的连字符。 有什么办法可以将文件名存储为UTF-8? 当我尝试此代码时,出现错误: $fn = iconv("CP-1252", "UTF-8", $file['name']); debug($fn); Notice (8): iconv(): Wrong charset, conversion from `CP-1252' to `UTF-8' is not allowed -- 几个月后更新! 因此,此问题与Windows上的PHP错误有关:http://bugs.php.net/bug.php?id=47096 Unicode字符在move_upload_file上被PHP破坏了-尽管我也看到过重命名和ZipArchive的问题,所以我认为这是PHP和Windows的普遍问题。 我已改编自此处找到的Wordpress的变通方法。 我必须使用变形的文件名存储该文件,然后在下载/电子邮件/显示中对其进行清理。 这是我正在使用的适应方法
  • php zipArchive 仅解压缩某些扩展(php zipArchive unzip only certain extensions)
    问题 我需要解压缩上传的内容。 但是出于安全目的必须验证文件只是图像文件,以便有人无法将 php 添加到 zip 中,然后再运行它。 在进行解压缩时,我还需要保留文件结构。 $zip->extractTo($save_path . $file_name, array('*.jpg','*.jpeg','*.png','*.gif') ); 不返回空值。 是否有我可以使用的参数,或者我必须使用正则表达式循环遍历 zip 文件以匹配扩展名并创建文件夹并使用代码保存文件? 谢谢 回答1 从 php.net,处理 .txt 文件 <?php $value="test.zip"; $filename="zip_files/$value"; $zip = new ZipArchive; if ($zip->open($filename) === true) { echo "Generating TEXT file."; for($i = 0; $i < $zip->numFiles; $i++) { $entry = $zip->getNameIndex($i); if(preg_match('#\.(txt)$#i', $entry)) { ////This copy function will move the entry to the root of "txt_files"