亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

微信小程序錄音實(shí)現(xiàn)功能并上傳(使用node解析接收)

 更新時(shí)間:2020年02月26日 14:14:21   作者:weixin_43188227  
在我們的日常開(kāi)發(fā)中經(jīng)常會(huì)遇到錄音功能,并上傳到服務(wù)器,今天小編給大家分享微信小程序錄音功能實(shí)現(xiàn)并上傳錄音文件,使用node解析接收,需要的朋友可以參考下

背景

我在開(kāi)發(fā)小程序的時(shí)候,有需求要實(shí)現(xiàn)錄音功能,并能上傳給服務(wù)器。小程序錄音功能我是使用的微信的wx.getRecorderManager()實(shí)現(xiàn)的,通過(guò)該方法創(chuàng)建實(shí)例,實(shí)例錄音得到的文件是本地臨時(shí)文件,上傳文件需要使用微信的wx.uploadFile(Object object)方法,這就是本次項(xiàng)目的背景。

小程序端

html頁(yè)面主要是第一個(gè)按鈕,兩個(gè)事件,長(zhǎng)按開(kāi)始錄音,松手停止錄音。第二個(gè)按鈕只是一個(gè)播放錄音的功能,用于確定錄音是否成功

<!--pages/record/record.wxml-->
<button bindtap="playVoice" type="primary" disabled="{{tempFilePath === ''}}">播放錄音</button>
<button type="warn" bindtouchstart="beginRecord" bindtouchend="endRecord">長(zhǎng)按開(kāi)始錄音,松手停止錄音</button>

js部分主要就是兩個(gè)事件

// pages/record/record.js
// 兩個(gè)實(shí)例聲明在Page之外,方便訪問(wèn)
const recorderManager = wx.getRecorderManager() //這是錄音功能的實(shí)例,必須的
const innerAudioContext = wx.createInnerAudioContext(); //這是播放錄音功能需要的實(shí)例
Page({
 data: {
 tempFilePath: '' //存放錄音文件的臨時(shí)路徑
 },
 // 播放錄音
 playVoice: function(e) {
 innerAudioContext.onPlay(() => {
 console.log('開(kāi)始播放')
 })
 innerAudioContext.onError((res) => {
 console.log(res.errMsg)
 console.log(res.errCode)
 })
 innerAudioContext.play();
 },
 // 錄音
 beginRecord:function(e) {
 // 監(jiān)聽(tīng)錄音開(kāi)始事件
 recorderManager.onStart(() => {
 console.log('recorder start')
 })
 // 監(jiān)聽(tīng)已錄制完指定幀大小的文件事件。如果設(shè)置了 frameSize,則會(huì)回調(diào)此事件。
 recorderManager.onFrameRecorded((res) => {
 const { frameBuffer } = res
 console.log('frameBuffer.byteLength', frameBuffer.byteLength)
 })
 //錄音的參數(shù)
 const options = {
 duration: 60000, //錄音時(shí)間,默認(rèn)是60s,提前松手會(huì)觸發(fā)button的bindtouchend事件,執(zhí)行停止函數(shù)并上傳錄音文件。超過(guò)60s不松手會(huì)如何并未測(cè)試過(guò)
 sampleRate: 44100,
 numberOfChannels: 1,
 encodeBitRate: 192000,
 format: 'mp3', //錄音格式,這里是mp3
 frameSize: 50 //指定幀大小,單位 KB。傳入 frameSize 后,每錄制指定幀大小的內(nèi)容后,會(huì)回調(diào)錄制的文件內(nèi)容,不指定則不會(huì)回調(diào)。暫僅支持 mp3 格式。
 }
 //開(kāi)始錄音
 recorderManager.start(options); 
 },
 //停止錄音并上傳數(shù)據(jù)
 endRecord:function(e) {
 const self = this;
 //停止錄音
 recorderManager.stop();
 //監(jiān)聽(tīng)錄音停止事件,執(zhí)行上傳錄音文件函數(shù)
 recorderManager.onStop((res) => {
 console.log('recorder stop', res)
 //返回值res.tempFilePath是錄音文件的臨時(shí)路徑 (本地路徑) 
 self.setData({
 tempFilePath: res.tempFilePath
 })
 innerAudioContext.src = res.tempFilePath
 //上傳錄音文件
 var uploadTask = wx.uploadFile({
 //沒(méi)有method,自動(dòng)為POST請(qǐng)求
 filePath: res.tempFilePath,
 name: 'recordFile',  //這個(gè)隨便填
 url: 'http://localhost:3000/record', //填寫(xiě)自己服務(wù)器的地址。
 header: {
 "Content-Type": "multipart/form-data" //必須是這個(gè)格式
 },
 success:(e) => {
 console.log('succeed!');
 console.log(e); 
 },
 fail: (e) => {
 console.log('failed!');
 console.log(e); 
 }
 });
 uploadTask.onProgressUpdate((e) => {
 console.log(e);
 console.log('期望上傳的總字節(jié)數(shù):' + e.totalBytesExpectedToSend);
 console.log('已經(jīng)上傳的字節(jié)數(shù)' + e.totalBytesSent); 
 })
 })
 }
})

到這里,小程序部分的代碼就已經(jīng)完成了。

node服務(wù)器端

前提:

node服務(wù)器我是用的是 express 框架,如果有不會(huì)的朋友,可以先簡(jiǎn)單了解一下express
要后端能解析用戶(hù)上傳的文件,需要合適的中間件。可以參考文章末尾的講解nodejs使用connect-multiparty實(shí)現(xiàn)文件上傳(文件接收)后端。
首先項(xiàng)目需要安裝 express 和 connect-multiparty

npm install express

npm install connnect-multiyparty

大家學(xué)node的,上面兩句不應(yīng)該看不懂。我不加 --save 是因?yàn)樾掳娴膎ode和npm不需要加就會(huì)給你保存在package.json文件內(nèi)。

//這是我的路由文件的代碼片段,監(jiān)聽(tīng)端口號(hào)3000等設(shè)置在我的另一個(gè)文件內(nèi)。
//這只是代碼片段,大概率跑不起來(lái),只起一個(gè)demo的作用。如果需要完整的代碼,可以留言給我。

const express = require('express');
const multiparty = require('connect-multiparty');

var router = express.Router();
var multipartMiddleware = multiparty();
router.use(multiparty({uploadDir:'./temp'})); //將接收文件的地址更改為當(dāng)前目錄下的temp文件夾。如果沒(méi)有,則需要新建該文件夾。

// 處理錄音文件
//只需要這樣處理,上傳的MP3文件就會(huì)保存在指定的目錄下了。
router.post('/record', multipartMiddleware, (request, response) => {
 console.log('received a request');
 console.log(request.files);
 request.on('end', () => {
 response.send('通信完成');
 })
 
})

鄭重提示:保存下來(lái)的是臨時(shí)文件,短時(shí)間內(nèi)就會(huì)自動(dòng)刪除,所以大家需要及時(shí)處理文件,比如寫(xiě)入到新文件中

這個(gè)框架已經(jīng)兩年沒(méi)更新了,所以這個(gè)框架這不一定是好的,但是是可行的

下面看下nodejs使用connect-multiparty實(shí)現(xiàn)文件上傳(文件接收)后端

文件上傳

文件上傳是服務(wù)器經(jīng)常會(huì)用到的一項(xiàng)功能。做了幾次文件上傳功能,發(fā)現(xiàn)文件接收后端還是沒(méi)那么容易。嘗試過(guò)不同的中間件,折騰來(lái)折騰去,發(fā)現(xiàn)connect-multiparty用起來(lái)比較簡(jiǎn)單,適配nodejs版本v0.12.11。

用法

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
app.post('/upload', multipartMiddleware, function(req, resp) {
 console.log(req.body, req.files);
 // don't forget to delete all req.files when done
});

前端用multipart/form-data的形式上傳數(shù)據(jù),后端通過(guò)中間件connect-multipary接收。
注意,接收結(jié)果req.files是一個(gè)對(duì)象,包含POST上傳的參數(shù)和一個(gè)臨時(shí)文件,文件一般在/tmp目錄下,可以將文件移動(dòng)到指定位置。

var fs = require('fs');
var source = fs.createReadStream(path);
var dest = fs.createWriteStream(output);
source.pipe(dest);
source.on('end', function() { fs.unlinkSync(path);}); //delete
source.on('error', function(err) { });

參考

connect-multiparty

總結(jié)

到此這篇關(guān)于微信小程序錄音實(shí)現(xiàn)功能并上傳(使用node解析接收)的文章就介紹到這了,更多相關(guān)微信小程序錄音上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript 循環(huán)調(diào)用示例介紹

    javascript 循環(huán)調(diào)用示例介紹

    循環(huán)調(diào)用,如果已經(jīng)獲取到了結(jié)果,則退出循環(huán),下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以嘗試操作下
    2013-11-11
  • 微信小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽

    微信小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • ajax前臺(tái)后臺(tái)跨域請(qǐng)求處理方式

    ajax前臺(tái)后臺(tái)跨域請(qǐng)求處理方式

    本篇文章通過(guò)前臺(tái)跨域請(qǐng)求處理以及后臺(tái)跨域的數(shù)據(jù)處理方式介紹,詳細(xì)分析了ajax跨域的問(wèn)題,對(duì)此有需要的朋友學(xué)習(xí)下。
    2018-02-02
  • js 右側(cè)浮動(dòng)層效果實(shí)現(xiàn)代碼(跟隨滾動(dòng))

    js 右側(cè)浮動(dòng)層效果實(shí)現(xiàn)代碼(跟隨滾動(dòng))

    因?yàn)轫?xiàng)目上有這樣的需求,在網(wǎng)上也查了些東西,之前是想找個(gè)差不多類(lèi)似的套用一下。后來(lái)發(fā)覺(jué)沒(méi)有合適的,因時(shí)間緊迫就自己動(dòng)手寫(xiě)了一個(gè)簡(jiǎn)單的 ,示例代碼如下 兼容火狐和IE7+
    2015-11-11
  • 原生javascript和jquery判斷瀏覽器版本等信息

    原生javascript和jquery判斷瀏覽器版本等信息

    本文為大家詳細(xì)介紹下通過(guò)jquery和原生javascript判斷瀏覽器信息包括:判斷瀏覽器是否為IE以及IE版本是多少等等,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助
    2013-07-07
  • 使用bootstrap莫名其妙出現(xiàn)橫向滾動(dòng)條的問(wèn)題及解決

    使用bootstrap莫名其妙出現(xiàn)橫向滾動(dòng)條的問(wèn)題及解決

    這篇文章主要介紹了使用bootstrap莫名其妙出現(xiàn)橫向滾動(dòng)條的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • JS實(shí)現(xiàn)跟隨鼠標(biāo)閃爍轉(zhuǎn)動(dòng)色塊的方法

    JS實(shí)現(xiàn)跟隨鼠標(biāo)閃爍轉(zhuǎn)動(dòng)色塊的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)跟隨鼠標(biāo)閃爍轉(zhuǎn)動(dòng)色塊的方法,涉及javascript操作html元素及css樣式的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • JavaScript實(shí)現(xiàn)簡(jiǎn)潔的俄羅斯方塊完整實(shí)例

    JavaScript實(shí)現(xiàn)簡(jiǎn)潔的俄羅斯方塊完整實(shí)例

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)潔的俄羅斯方塊,以完整實(shí)例形式分析了JavaScript實(shí)現(xiàn)俄羅斯方塊游戲的具體技巧,代碼備有詳盡的注釋便于理解,需要的朋友可以參考下
    2016-03-03
  • 一文教你如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS

    一文教你如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS

    HTML中通過(guò)使用css可以讓網(wǎng)頁(yè)的美觀效果更進(jìn)一步,下面這篇文章主要給大家介紹了如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS的相關(guān)資料,文中給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下
    2021-09-09
  • JavaScript數(shù)組的使用詳解

    JavaScript數(shù)組的使用詳解

    這篇文章主要介紹了JavaScript數(shù)組的使用方法,數(shù)組(Array)是有序的元素序列。若將有限個(gè)類(lèi)型相同的變量的集合命名,那么這個(gè)名稱(chēng)為數(shù)組名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論