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

electron项目中实现视频下载保存到本地

  • 第一种方式:用户自定义选择下载地址位置

渲染进程

// 渲染进程// 引入
import { ipcRenderer } from "electron";// 列表行数据下载视频操作,diffVideoUrl 是视频请求地址
handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message.error("暂无视频,请稍后重试下载");} else {//渲染线程主动发送 downloadVideo事件到主线程请求下载视频ipcRenderer.send("downloadVideo", row.diffVideoUrl, row.orderCode);}
}

主进程

// 主进程// 引入
import { ipcMain, dialog } from "electron";
import path from "path";
import fs from "fs";
import axios from "axios";// 监听渲染进程下载视频
ipcMain.on("downloadVideo", async (event, videoUrl, fileName) => {let result = await dialog.showOpenDialog({properties: ["openDirectory", "createDirectory", "promptToCreate"],});if (!result.canceled) {// 用户选择的路径let directoryPath = result.filePaths[0];// 获取目标文件的路径const destPath = path.join(directoryPath, fileName + ".mp4");try {// 请求七牛视频地址接口,获取视频const response = await axios({method: "get",url: videoUrl,responseType: "stream", // 以流的形式获取响应体,用于写入文件});// 在用户选择的目标文件路径下创建一个可写流const ws = fs.createWriteStream(destPath);// 将数据流保存到文件中response.data.pipe(ws);dialog.showMessageBox(mainWindow, {message: "已下载成功!",type: "none",});} catch (error) {console.log(error);dialog.showMessageBox(mainWindow, {message: "下载失败!",type: "none",});}}
});
  • 第二种方式:系统内部设置默认下载地址位置

渲染进程

// 渲染进程// 引入
import { ipcRenderer } from "electron";// 列表行数据下载视频操作,diffVideoUrl 是视频请求地址
handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message.error("暂无视频,请稍后重试下载");} else {//渲染线程主动发送 downloadVideo事件到主线程请求下载视频ipcRenderer.send("downloadVideo", row.diffVideoUrl, row.orderCode);}
}

主进程

// 主进程// 引入
import { app, ipcMain, dialog } from "electron";
import path from "path";
import fs from "fs";
import axios from "axios";// 监听渲染进程下载视频
ipcMain.on("downloadVideo", async (event, videoUrl, fileName) => {// 默认下载到电脑 downloads 目录下let directoryPath = app.getPath("downloads");// 获取目标文件的路径const destPath = path.join(directoryPath, fileName + ".mp4");try {// 请求七牛视频地址接口,获取视频const response = await axios({method: "get",url: videoUrl,responseType: "stream", // 以流的形式获取响应体,用于写入文件});// 在用户选择的目标文件路径下创建一个可写流const ws = fs.createWriteStream(destPath);// 将数据流保存到文件中response.data.pipe(ws);dialog.showMessageBox(mainWindow, {message: "已下载成功!",type: "none",});} catch (error) {console.log(error);dialog.showMessageBox(mainWindow, {message: "下载失败!",type: "none",});}
});

代码中相关代码点解释:

mainWindownew BrowserWindow() 创建应用程序窗口,此处省略相关代码,例子代码如下:

// 在主进程中.
const { BrowserWindow } = require('electron')const mainWindow = new BrowserWindow({ width: 800, height: 600 })

dialog.showOpenDialog 参考官方文档:dialog.showOpenDialog

dialog.showOpenDialog
app.getPath 参考官方文档:app.getPath

app.getPath
如有其它问题,请在评论区留言,博主看到都会回复的~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【深度学习】VGG-16原理及代码实现
  • 【深度学习】OCR中的Shrink操作详解
  • 【分布式事务】怎么解决分布式场景下数据一致性问题
  • Springboot 3.x - Reactive programming (2)
  • 钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器
  • GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION
  • vue基于Cookies实现记住密码自动登录功能
  • Spring Boot外部配置加载顺序
  • Github报错:Kex_exchange_identification: Connection closed by remote host
  • Linux云计算 |【第一阶段】ENGINEER-DAY3
  • centos(或openEuler系统)安装kafka集群
  • 中文科技核心论文发表
  • java多线程等待唤醒机制详细介绍
  • [React]利用Webcomponent封装React组件
  • 【Python将字符串连接在一起】
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Javascript编码规范
  • java多线程
  • Js基础知识(一) - 变量
  • Lsb图片隐写
  • Python学习之路13-记分
  • Spring Boot MyBatis配置多种数据库
  • SpringCloud集成分布式事务LCN (一)
  • Vue ES6 Jade Scss Webpack Gulp
  • vue的全局变量和全局拦截请求器
  • 力扣(LeetCode)21
  • 如何解决微信端直接跳WAP端
  • 微信支付JSAPI,实测!终极方案
  • 我的面试准备过程--容器(更新中)
  • 一天一个设计模式之JS实现——适配器模式
  • ​ArcGIS Pro 如何批量删除字段
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (3)nginx 配置(nginx.conf)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一) springboot详细介绍
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 未来三学期想要修的课 (日記)
  • (转)母版页和相对路径
  • ..回顾17,展望18
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .describe() python_Python-Win32com-Excel
  • .gitignore文件_Git:.gitignore
  • .htaccess配置常用技巧
  • .net core 6 redis操作类
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 调用海康SDK以及常见的坑解释
  • .net 发送邮件
  • .NET 依赖注入和配置系统
  • .net开发日常笔记(持续更新)
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET下的多线程编程—1-线程机制概述