如何用MediaStream按用户媒体集创建带文件夹的压缩包?
问题描述
每个用户拥有4个媒体集,需要在MediaStream生成的压缩包里实现文件夹1包含集1所有媒体、文件夹2包含集2所有媒体的结构,但当前代码会把所有媒体直接放进压缩包根目录:
$downloads = Media::where('model_id',$user->id)->get(); return MediaStream::create($user->code.'.zip')->addMedia($downloads);
查阅官方文档后,仍无法结合以下示例实现需求:
$mediaItem = Media::find($id); $mediaItem->setCustomProperty('zip_filename_prefix', 'folder/subfolder/'); // 将媒体存入子文件夹 $mediaItem->save(); $mediaStream = MediaStream::create('export.zip'); $mediaStream->addMedia($mediaItem);
解决方案
核心是给不同媒体集的媒体文件设置对应文件夹路径的zip_filename_prefix属性,再批量添加到MediaStream中,具体实现如下:
1. 按媒体集分组媒体文件
假设你的Media模型通过collection_name字段区分不同媒体集(如果是其他字段,替换成对应字段名),先按该字段分组获取媒体:
// 按媒体集分组用户的所有媒体文件 $groupedMedia = Media::where('model_id', $user->id) ->get() ->groupBy('collection_name');
2. 批量设置文件夹前缀并添加到压缩流
遍历分组后的媒体,给每个媒体指定对应集的文件夹路径,再添加到MediaStream:
$zipStream = MediaStream::create($user->code . '.zip'); // 遍历每个媒体集 foreach ($groupedMedia as $index => $mediaItems) { // 自定义文件夹名称,比如「文件夹1」「文件夹2」 $folderPrefix = '文件夹' . ($index + 1) . '/'; // 也可以用媒体集原名称:$folderPrefix = $collectionName . '/'; foreach ($mediaItems as $media) { // 设置压缩包内的存储路径前缀 $media->setCustomProperty('zip_filename_prefix', $folderPrefix); $media->save(); // 持久化属性设置 $zipStream->addMedia($media); } } return $zipStream;
可选优化:不修改数据库的临时设置
如果不想修改媒体库的持久化数据,可以使用临时设置(无需调用save()),部分版本的MediaStream支持这种方式:
foreach ($mediaItems as $media) { // 第三个参数传false,仅临时设置属性,不保存到数据库 $media->setCustomProperty('zip_filename_prefix', $folderPrefix, false); $zipStream->addMedia($media); }
内容的提问来源于stack exchange,提问作者KrutSednar
相关产品推荐
相关产品推荐

