如何在 Node.js 中从 URL 下载音频文件?

问题描述 投票:0回答:4

如何从URL下载音频文件并将其存储在本地目录中? 我正在使用 Node.js,并尝试了以下代码:

var http = require('http');
var fs = require('fs');
var dest = 'C./test'
var url= 'http://static1.grsites.com/archive/sounds/comic/comic002.wav'
function download(url, dest, callback) {
  var file = fs.createWriteStream(dest);
  var request = http.get(url, function (response) {
    response.pipe(file);
    file.on('finish', function () {
      file.close(callback); // close() is async, call callback after close completes.
    });
    file.on('error', function (err) {
      fs.unlink(dest); // Delete the file async. (But we don't check the result)
      if (callback)
        callback(err.message);
    });
  });
}

没有发生错误,但未找到文件。

javascript node.js audio
4个回答
6
投票

重复如何使用 Node.js 下载文件(不使用第三方库)?,但这是特定于您的问题的代码:

var http = require('http');
var fs = require('fs');

var file = fs.createWriteStream("file.wav");
var request = http.get("http://static1.grsites.com/archive/sounds/comic/comic002.wav", function(response) {
  response.pipe(file);
});

0
投票

你的代码实际上没问题,只是没有调用下载函数。尝试将其添加到末尾:

download(url, dest, function(err){
   if(err){
     console.error(err);
   }else{
     console.log("Download complete");
   }
});

此外,将

dest
的值更改为其他值,例如
"test.wav"
或其他值。
'C./test'
是一条糟糕的路。

我在我的机器上尝试过,你的代码工作正常,只需添加调用并更改

dest


0
投票

这是一个使用 Axios 和可能需要授权的 API 的示例

const Fs = require('fs');
const Path = require('path');
const Axios = require('axios');

async function download(url) {
    let filename = "filename";
    const username = "user";
    const password = "password"
    const key = Buffer.from(username + ':' + password).toString("base64");
    const path = Path.resolve(__dirname, "audio", filename)
    const response = await Axios({
        method: 'GET',
        url: url,
        responseType: 'stream',
        headers: { 'Authorization': 'Basic ' + key }
    })
    response.data.pipe(Fs.createWriteStream(path))
    return new Promise((resolve, reject) => {
        response.data.on('end', () => {
            resolve();
        })
        response.data.on('error', () => {
            reject(err);
        })
    })
}


0
投票

这应该可行,我使用来自 freesound.org 的多个来源进行了测试,例如这个: https://cdn.freesound.org/previews/512/512246_7704891-hq.mp3


  public static async downloadAudio(audioSource: string, path: string) {
    const response = await axios.get(audioSource, {
      responseType: 'arraybuffer',
    });

    const arrayBuffer = response.data;
    const uintArray = new Uint8Array(arrayBuffer);
    const byteArray = Array.from(uintArray);
    const base64String = btoa(byteArray.map((char) => String.fromCharCode(char)).join(''));

    // choose an appropriate file writer here
    await Filesystem.writeFile({
      path: path,
      data: base64String,
      directory: Directory.Documents,
      recursive: true,
    });
  }
© www.soinside.com 2019 - 2024. All rights reserved.