vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip


Posted in Javascript onJune 02, 2020

看看效果叭

vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip

解压的文件

vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip

上传的文件格式

测试1|||测试1的文字
测试2|||测试2的文字
测试3|||测试3的文字
测试4|||测试4的文字
测试5|||测试5的文字

实现的逻辑如下

  • 上传文件
  • 解析txt
  • 发送内容至百度语音合成
  • 生成文件夹放置本次合成的mp3文件,并压缩成zip
  • 发送zip的地址给前端

使用了 element-ui 的 el-upload 组件

<el-upload
  v-loading="loading"
  class="upload-demo"
  drag
  ref="upload"
  action="#"
  accept=".txt"
  :before-upload="onBeforeUploadImage"
  :http-request="UploadImage"
  :on-change="fileChange"
  :file-list="fileList"
 >
 <i class="el-icon-upload"></i>
 <div class="el-upload__text">
  将文件拖到此处,或
  <em>点击上传</em>
 </div>
 <div class="el-upload__tip" slot="tip">只能上传txt文件,且不超过1M</div>
</el-upload>

在上传之前判断上传的文件是否符合要求

onBeforeUploadImage(file) {
 const isTxt = file.type === "text/plain";
 const isLt1M = file.size / 1024 / 1024 < 1;
 if (!isTxt) {
  this.$message.error("上传文件只能是txt格式!");
 }
 if (!isLt1M) {
  this.$message.error("上传文件大小不能超过 1MB!");
 }
 return isTxt && isLt1M;
}

一次只上传一个文件,在文件列表更新时先清除之前的文件

fileChange(file) {
  let obj = this.onBeforeUploadImage(file.raw);
  if (obj) {
    this.$refs.upload.clearFiles(); 
    this.fileList = [{ name: file.name, url: file.url }];
  }
}

上传的主要函数

UploadImage(param) {
  this.loading = true;
  const formData = new FormData();
  formData.append("file", param.file);
  this.$axios({
    url: process.env.VUE_APP_BASE_API + "api/txtToMp3",
    method: "post",
    data: formData
  })
  .then(response => {
    if (response.data.code == 0) {
      this.loading = false;
      this.dialogVisible = true;
      this.url = response.data.data.url;
    }
  })
  .catch(error => {
    console.log(error);
  });
}

node代码

用到的依赖项

const formidable = require("formidable"); //获取上传的txt,并保存
const path = require("path"); 
const AipSpeech = require("baidu-aip-sdk").speech; //百度语音合成sdk
const fs = require("fs"); 
const compressing = require("compressing"); //压缩文件夹用

接口代码

router.post("/txtToMp3", async function (req, res, next) {
 let form = new formidable.IncomingForm();
 form.encoding = "utf-8"; //编码
 form.uploadDir = path.join(__dirname + "/../txt"); //保存上传文件地址
 form.keepExtensions = true; //保留后缀

 form.parse(req, function (err, fields, files) {
  let filename;
  filename = files.file.name;

  let nameArray = filename.split("."); //分割
  let type = nameArray[nameArray.length - 1];
  let name = "";
  for (let i = 0; i < nameArray.length - 1; i++) {
   name = name + nameArray[i];
  }
  let date = new Date();
  let time = "_" + date.getTime();
  let avatarName = name + time + "." + type;
  let newPath = form.uploadDir + "/" + avatarName;
  fs.renameSync(files.file.path, newPath); //移动文件
  fs.readFile(newPath, "utf-8", function (err, data) {
   if (err) {
    console.log(err);
    new Result(null, "读取失败").fail(res);
   } else {
    let client = new AipSpeech(
     0,
     "百度语音合成key",
     "百度语音合成secret"
    );

    let resultData = data.split("\n");
    let number = resultData.length;
    let formTime = new Date().getTime();
    let mp3FileDir = path.join(__dirname + "/../mp3_" + formTime);
    fs.mkdirSync(mp3FileDir);
    for (let i in resultData) {
      setTimeout(function(){
        if (resultData[i].indexOf("|||") != -1) {
        let text = resultData[i].split("|||")[1];
        // 语音合成,保存到本地文件
        client.text2audio(text, { spd: 4, per: 4 }).then(
         function (result) {
          if (result.data) {
           let time = resultData[i].split("|||")[0] + "_voice";
           let avatarName_mp3 = mp3FileDir + "/" + time + ".mp3";
           fs.writeFileSync(avatarName_mp3, result.data);
           number--;
           if (number == 0) {
            let zipFileName = "zip/mp3_" + formTime + ".zip";
            compressing.zip
             .compressDir(mp3FileDir, zipFileName)
             .then(() => {
              let item = {
               url: zipFileName,
              };
              new Result(item, "压缩成功").success(res);
             })
             .catch((err) => {
              new Result(null, "压缩失败").fail(res);
             });
           }
          } else {
           // 合成服务发生错误
           new Result(null, "合成失败").fail(res);
          }
         },
         function (err) {
          console.log(err);
         }
        );
       } else {
        new Result(null, "文件格式错误").fail(res);
       }  
      },i * 20)
    }
   }
  });
 });
});

PS:

在node部分,在判断需要合成的文件是否全部完成时,我是通过number的值等于0判断完成,不知道大佬们有啥好方法不?

到此这篇关于vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip的文章就介绍到这了,更多相关vue node批量生成MP3内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
我遇到的参数传递中 双引号单引号嵌套问题
Feb 11 Javascript
javascript操作JSON的要领总结
Dec 09 Javascript
extjs3 combobox取value和text案例详解
Feb 06 Javascript
JS增加行复制行删除行的实现代码
Nov 09 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
vue实现动态列表点击各行换色的方法
Sep 13 Javascript
vue-cli项目配置多环境的详细操作过程
Oct 30 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 Javascript
JS数组求和的常用方法实例小结
Jan 07 Javascript
vue-router 中 meta的用法详解
Nov 01 Javascript
uniapp与webview之间的相互传值的实现
Jun 29 Javascript
Vue Mint UI mt-swipe的使用方式
Jun 05 Vue.js
js简单实现自动生成表格功能示例
Jun 02 #Javascript
JS中准确判断变量类型的方法
Jun 01 #Javascript
Vuex中的Mutations的具体使用方法
Jun 01 #Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 #Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 #Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 #Javascript
JS如何寻找数组中心索引过程解析
Jun 01 #Javascript
You might like
PHP parse_url 一个好用的函数
2009/10/03 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
浅析Python多线程下的变量问题
2015/04/28 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
大学生冰淇淋店商业计划书
2014/01/14 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
教师节主题班会教案
2015/08/17 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
初中信息技术教学反思
2016/02/16 职场文书