fastadmin批量压缩下载远程视频文件

后端代码

php 复制代码
    // 批量下载并压缩
public function downloadAll(){
    $ids = input('ids');
    $row = $this->model->where('id', 'in', $ids)->field('id,title,video_url')->select();
    if (!$row) {
        $this->error('记录不存在');
    }

    $arr = [];
    $tempFiles = []; // 用来存储临时下载的视频文件路径

    // 打包视频文件的 ZIP 文件名
    $zipname = '视频文件[' . str_replace(',', '_', $ids) . ']' . date('YmdHis') . '.zip';

    // 初始化 ZIP 压缩包
    $zip = new \ZipArchive();
    if ($zip->open($zipname, \ZIPARCHIVE::CREATE) !== TRUE) {
        $this->error('无法创建压缩包');
    }

    foreach ($row as $item) {
        // 假设视频链接存储在数据库中的 'video_url' 字段
        $videoUrl = $item['video_url']; // 远程视频的 URL
        $fileName = basename($videoUrl); // 获取文件名
        
        // 直接通过 HTTP 流式读取远程文件并将其写入到 ZIP 中
        if ($this->addRemoteFileToZip($zip, $videoUrl, $fileName)) {
            $arr[] = $fileName; // 添加到数组
        }
    }

    if (empty($arr)) {
        $this->error('没有可下载的视频文件');
    }

    // 关闭 ZIP 文件
    $zip->close();

    // 发送到浏览器
    \fast\Http::sendToBrowser($zipname);
}

/**
 * 将远程文件流式读取并添加到 ZIP 压缩包
 * @param ZipArchive $zip ZipArchive 对象
 * @param string $url 远程文件 URL
 * @param string $fileName 压缩包中的文件名
 * @return bool 是否成功
 */
private function addRemoteFileToZip($zip, $url, $fileName) {
    // 打开远程文件的 URL 进行流式读取
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  // 允许 URL 重定向
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);  // 设置超时时间

    $fileContent = curl_exec($ch);
    if (curl_errno($ch)) {
        curl_close($ch);
        return false; // 下载失败
    }

    // 获取文件内容并关闭 cURL
    curl_close($ch);

    // 将内容添加到 ZIP 文件
    if ($fileContent !== false) {
        $zip->addFromString($fileName, $fileContent); // 使用文件名和内容添加到 ZIP 中
        return true;
    }

    return false;
}

前端js代码

javascript 复制代码
                    //批量下载
            $(document).on("click", ".btn-download", function () {
               var selectedrow = table.bootstrapTable('getSelections');
               if(selectedrow.length<1){
                   Toastr.error('未选择任何记录,不能下载!');
                   return;
               }
               var ids = [];
               for(var i=0;i<selectedrow.length;i++){
                   ids[i] = selectedrow[i].id;//  遍历选择记录
               }
               location.href='/admin/downloadAll?ids='+ids.join(',')
            });
相关推荐
ETO_冬4 天前
FastAdmin后端列表导入表格数据
javascript·thinkphp·fastadmin
ETO_冬12 天前
Fastadmin根据链接参数显示不同列表格
javascript·php·thinkphp·fastadmin
appleคิดถึง2 个月前
fastadmin 表格数据导入
html·php·fastadmin
appleคิดถึง4 个月前
fastadmin 列表页表格实现动态列
android·fastadmin·tp5
appleคิดถึง4 个月前
fastadmin 多商户模式下侧边栏跳转路径BUG
fastadmin·多商户
向宇it5 个月前
fastadmin搜索刷新列表,怎么限制用户频繁点击?
开发语言·前端·javascript·fastadmin
向宇it5 个月前
FastAdmin列表用echats渲染,使用表格的templateView实现一个图表渲染的功能
php·web·fastadmin
向宇it5 个月前
一张图解析FastAdmin中的弹出窗口的功能(备份)
php·fastadmin
梦夏夜6 个月前
fastadmin 文件上传七牛云
php·七牛云存储·fastadmin·tp5