当前位置: 首页 > 知识库问答 >
问题:

解压缩或膨胀php://输入流?

於功
2023-03-14
curl --request POST \
  --url 'http://myproject.app/upload' \
  --data-binary "@myfile.zip" \

下面是我尝试过的所有方法的列表,这些方法都失败了:

dd(file_get_contents('compress.zlib://php://input'));

file_get_contents():不能将输入类型的流表示为文件描述符

$fh = fopen('php://input', 'rb');

stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ, array('window'=>15));

$data = '';

while (!feof($fh)) {
    $data .= fread($fh, 8192);
}

dd($data);

“”

$zip = new ZipArchive;

$zip->open('php://input');
$zip->extractTo(storage_path() . '/' . 'myfile');
$zip->close();

https://arjunphp.com/how-to-unpack-a-zip-file-using-php/

我开始认为用PHP内置的zip功能来操作流是不可能的。编写临时文件的开销和复杂性将非常令人失望。有人知道怎么做到这一点吗,还是一个bug?

共有1个答案

羿宏硕
2023-03-14

经过更多的研究,我发现了答案,但并不令人满意。由于现代世界的一个大错误,gzip和zip不是相同的格式。gzip编码单个文件(这就是为什么我们经常看到tar.gz),而zip编码文件和文件夹。我试图上传一个zip文件并用gzip解码它,但这不起作用。更多信息:

https://stackoverflow.com/a/20765054/539149

https://stackoverflow.com/a/1579506/539149

$input = fopen("php://input", "rb");
$temp = fopen("php://temp", "rb+");
stream_copy_to_stream($input, $temp);
rewind($temp);
dd(stream_get_contents(gzopen('php://temp', 'rb')));

http://php.net/manual/en/function.gzopen.php#105676

http://php.net/manual/en/function.gzdecode.php#112200

我确实设法让一个纯内存中的解决方案工作,但由于不可能使用流,因此出现了不必要的复制:

// works (stream + string)
dd(gzdecode(file_get_contents('php://input')));
// works (stream + file)
dd(stream_get_contents(gzopen(storage_path() . '/' . 'myfile.gz', 'rb')));

// works (stream + file)
dd(file_get_contents('compress.zlib://' . storage_path() . '/' . 'myfile.gz'));
// doesn't work (stream)
dd(stream_get_contents(gzopen('php://input', 'rb')));

// doesn't work (stream + filter)
dd(file_get_contents('compress.zlib://php://input'));
 类似资料:
  • 问题内容: 是否存在用于隐藏在Internet上的ByteBuffer的gzip压缩库?是什么让我们可以推送原始数据然后提取缩小的数据?我们已经搜索了它,但是仅找到处理InputStreams和OutputStreams的库。 我们的任务是创建gzip过滤器,以缩小管道体系结构中的ByteBuffers流。这是拉式体系结构,其中最后一个元素从较早的元素中提取数据。我们的gzip过滤器处理ByteB

  • 我有一个正在工作的python模块,它能够读取LZMA压缩的SWF的头,但是它需要一个名为pyLZMA的模块,而这个模块似乎不想安装在我的服务器上,并且让它在本地工作是一个巨大的麻烦,所以如果有PHP解决方案的话,我更希望有一个PHP解决方案。

  • 问题内容: 我想解压缩文件,这可以正常工作 但是我需要通过URL传递文件名,而无法使其正常工作,这就是我所拥有的。 我想念什么?我知道这一定是我忽略的小而愚蠢的事情。 谢谢, 问题答案: 我只能假设您的代码来自在线某个地方的教程?在这种情况下,请尝试自己解决这个问题。另一方面,该代码实际上可以在线发布为解压缩文件的正确方法,这有点令人恐惧。 PHP具有用于处理压缩文件的内置扩展。不需要为此使用调用

  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • 我试图将我的GLSurfaceView设置在xml布局以及其他UI元素上,并不断获得错误inflating类com.vi.cubo01。MyGLSurfaceView在LogCat. 以下是java代码: 以及xml:

  • 我在自定义控件中膨胀MvxImageView时遇到问题。 从我所做的研究中,我发现了几个嫌疑人 > < li >我是否应该将“如果”添加到“什么”中?(我看到这是关于android地图视图膨胀错误。 < li> 我创建的用户控件是不是都错了?我看到了一个使用SetContentView()而不是inflate的建议,因为它通过mvvmcross机制传递indlate请求,但在自定义视图中没有这样的