没有不值得去解决的问题,也没有不值得去学习的技术!

在 Laravel 6 中基于 ZipStream PHP ,将 zip 文件流式传输到 S3 存储桶

当在请求 S3 存储桶时,遇到了限流问题:Please reduce your request rate,进而导致请求失败
1、当在请求 S3 存储桶时,遇到了限流问题:Please reduce your request rate,进而导致请求失败。如图1
当在请求 S3 存储桶时,遇到了限流问题:Please reduce your request rate,进而导致请求失败
图1
2、最终实现代码如下


$name = $themeId . '/assets.zip';

$zip = new ZipStream($name);

$zip->addFile('apps/internal/back-top/assets/app.9ce8af2.js', '0000000000000');

$res = Storage::disk(config('theme_asset.filesystem.disk'))->put(
	$name,
	$zip->finish(),
	config('theme_asset.filesystem.options')
);


3、在浏览器中打开 S3 对应的 CDN 地址:https://xxx.cloudfastin.com/static/xxx/98cb73f9-e61a-40b1-a27a-3beb99015e5e/assets.zip 。文件可下载,确认文件上传至 S3 成功。如图2
在浏览器中打开 S3 对应的 CDN 地址:https://themes-statics-test.cloudfastin.com/static/xxx/98cb73f9-e61a-40b1-a27a-3beb99015e5e/assets.zip 。文件可下载,确认文件上传至 S3 成功
图2
3、将下载后的文件解压缩,失败,提示:该文件为非压缩文件,无法打开。如图3
将下载后的文件解压缩,失败,提示:该文件为非压缩文件,无法打开
图3
4、使用 putStream 方法,且设置 ZipStream 对象的选项中,输出流。下载后,解压缩成功。如图4
使用 putStream 方法,且设置 ZipStream 对象的选项中,输出流。下载后,解压缩成功
图4


$name = $themeId . '/assets.zip';

$tmp = tempnam(sys_get_temp_dir(), 'zip_stream');
$stream = fopen($tmp, 'w+');

$options = new Archive();
//$options->setContentType('application/x-zip-compressed');
$options->setOutputStream($stream);
$zip = new ZipStream($name, $options);

$zip = new ZipStream($name);

$zip->addFile('apps/internal/back-top/assets/app.9ce8af2.js', '0000000000000');

$zip->finish();

$res = Storage::disk(config('theme_asset.filesystem.disk'))->putStream(
	$name,
	$stream,
	config('theme_asset.filesystem.options')
);


fclose($stream);


5、但是,如果路径中包含反斜杠,例,路径为:css\app.6156ec.css 的文件,其路径已经变化为:css_app.6156ec.css。如图5
但是,如果路径中包含反斜杠,例,路径为:css\app.6156ec.css 的文件,其路径已经变化为:css_app.6156ec.css
图5
6、需要将 路径为:css\app.6156ec.css 的文件,替换为:css/app.6156ec.css。上传至 S3,下载后解压缩,目录结构正常。如图6
需要将 路径为:css\app.6156ec.css 的文件,替换为:css/app.6156ec.css。上传至 S3,下载后解压缩,目录结构正常
图6


$zip->addFile(str_replace('\\', '/', 'css\\app.6156ec.css'), $file->getContents());


PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理