You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:55:16