微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将作为 HTTP 响应接收的二进制 ASCII 转换为 zip 文件

如何解决如何将作为 HTTP 响应接收的二进制 ASCII 转换为 zip 文件

我在尝试从具有多个带有 MIME 边界的附件的 HTTP POST 请求中读取数据时遇到问题:

----MIME_boundary

内容类型:text/xml;字符集=UTF-8

内容传输编码:8 位

内容 ID:

xml 数据

----MIME_boundary

内容类型:应用程序/zip

内容传输编码:二进制

Content-disposition:附件;文件名="test.zip"

内容 ID:

PK (二进制/ASCII 数据)

----MIME_boundary--

我使用在这文章的帮助下编写的函数将请求拆分为我需要的数据:Manually parse raw multipart/form-data data with PHP

基本上,我已经能够获取该 zip 文件的二进制文件,然后将其提供给我编写的另一个函数,该函数应该能够从二进制文件创建一个临时 zip 文件,然后我可以使用 ZipArchive PHP 中的类来读取并返回该 zip 文件中所有文件的列表。

public static function unzip($zipBinary) {

    $zip = new ZipArchive;

    // create temp file from given binary
    $file = tempnam("tmp","zip");
    file_put_contents($file,$zipBinary);

    $res = $zip->open($file,ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);

    if ($res === TRUE) {

        $files = [];

        // create array of files from zip

        for ($i = 0; $i < $zip->numFiles; $i++) {  
            $files[$zip->getNameIndex($i)] = $zip->getFromIndex($i);
        }  

        $zip->close();  

        // delete temp file

        unlink($file);

        return $files;

    } 

}

我一直遇到但似乎终生无法解决的问题是,使用 file_put_contents 创建的 zip 文件似乎根本不起作用。当我尝试计算文件数时,我得到 0。我不确定这是否是我被要求设置 REST 端点的示例请求中的二进制文件的问题,或者它是否是我的代码的问题.

我尝试了几种不同形式的调试 - 我已经通过查看 file_put_contents() 的返回值测试了 zip 文件实际上正在填充,并且我还尝试在临时文件上使用 rename()将它放在与我的脚本相同的目录中,以查看 zip 文件是否有效并且可以打开 - 事实并非如此,我在尝试打开它时收到“不支持的格式”错误 - 我也尝试用文本打开它编辑无济于事。我可能会尝试将不同的 zip 文件转换为二进制文件,并在我发布完这篇文章后尝试查看是否遇到相同的问题。

如果有人能指出我正确的方向并让我知道这是否是二进制文件的问题(以及我如何可能解决它),或者我是否可以更改代码以缓解该问题,我将不胜感激。

我从许多不同的 google/stackoverflow 搜索中尝试了许多不同的东西,但没有成功,并认为我会在这里发帖作为最后的手段。

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。