当前位置: 首页 > news >正文

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

后端代码

    // 批量下载并压缩
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; // 下载失败}// 获取文件内容并关闭 cURLcurl_close($ch);// 将内容添加到 ZIP 文件if ($fileContent !== false) {$zip->addFromString($fileName, $fileContent); // 使用文件名和内容添加到 ZIP 中return true;}return false;
}

前端js代码

                    //批量下载$(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(',')});

http://www.lryc.cn/news/504976.html

相关文章:

  • 【保姆级】Mac如何安装+切换Java环境
  • 2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章
  • Springboot静态资源
  • MTK修改配置更改产品类型ro.build.characteristics
  • SQL 查询中的动态字段过滤
  • 数字IC后端零基础入门基础理论(Day1)
  • 【LC】240. 搜索二维矩阵 II
  • Redis应用—4.在库存里的应用
  • selenium获取请求头
  • Rust中自定义Debug调试输出
  • docker离线安装、linux 安装docker
  • 卓易通:鸿蒙Next系统的蜜糖还是毒药?
  • AI大模型学习笔记|神经网络与注意力机制(逐行解读)
  • Linux 操作系统中的管道与共享内存
  • 恢复删除的文件:6个免费Windows电脑数据恢复软件
  • linux网络编程 | c | select实现多路IO转接服务器
  • 基于前后端分离的食堂采购系统源码:从设计到开发的全流程详解
  • 小程序自定义tab-bar,踩坑记录
  • 游戏引擎学习第52天
  • 【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ
  • 【HTML】根据不同域名设置不同的网站图标(替换 link 中 href 地址)
  • 使用Navicat从SQL Server导入表数据到MySQL
  • 私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?
  • 牛客网 SQL1查询所有列
  • 【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)
  • 如何使用ERC404协议
  • 240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现
  • ORACLE RAC ADG备库报错ORA-04021: timeout occurred while waiting to lock object
  • CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置
  • git使用教程(超详细)-透彻理解git