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 相关文章推荐
prototype 中文参数乱码解决方案
Nov 09 Javascript
让alert不出现弹窗的两种方法
May 18 Javascript
window.open()详解及浏览器兼容性问题示例探讨
May 29 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
2种jQuery 实现刮刮卡效果
Feb 01 Javascript
JavaScript图片轮播代码分享
Jul 31 Javascript
js代码实现无缝滚动(文字和图片)
Aug 20 Javascript
JavaScript中利用各种循环进行遍历的方式总结
Nov 10 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
Dec 30 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
Jul 06 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
Oct 19 Javascript
jQuery输入框密码的显示隐藏【代码分享】
Apr 29 jQuery
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 HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
在PHP中使用redis
2013/11/04 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
python 的列表遍历删除实现代码
2020/04/12 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
大数据分析用java还是Python
2020/07/06 Python
python speech模块的使用方法
2020/09/09 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
文明餐桌行动实施方案
2014/02/19 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
立项申请报告范本
2015/05/15 职场文书
教师读书笔记
2015/06/29 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers