Nodejs求助:有一个url链接的音频文件,直接打开是直接播放,现在我需要写一个接口,提供下载该wav文件,怎么做?

Nodejs求助:有一个url链接的音频文件,直接打开是直接播放,现在我需要写一个接口,提供下载该wav文件,怎么做?

fs 模块貌似只能读取本地上的文件。。求大神们帮忙有什么好的办法没有?

12 回复

当然可以!你可以使用 httphttps 模块来获取远程音频文件,并通过 Express 提供一个下载接口。以下是一个简单的示例代码,展示了如何实现这一功能:

步骤1: 安装依赖

确保你已经安装了 Node.js 和 npm。然后创建一个新的项目并安装必要的依赖(如果还没有安装的话):

npm init -y
npm install express axios

步骤2: 编写代码

创建一个名为 app.js 的文件,并添加以下代码:

const express = require('express');
const axios = require('axios');

const app = express();
const port = 3000;

// 设置下载路由
app.get('/download', async (req, res) => {
    try {
        const url = 'https://example.com/path/to/your/audiofile.wav'; // 替换为你的音频文件URL
        const response = await axios({
            method: 'get',
            url,
            responseType: 'stream' // 设置响应类型为流
        });

        // 设置响应头,以便浏览器知道这是一个文件下载
        res.set({
            'Content-Disposition': 'attachment; filename="audiofile.wav"',
            'Content-Type': 'audio/wav'
        });

        // 将音频文件流传递给客户端
        response.data.pipe(res);
    } catch (error) {
        console.error(error);
        res.status(500).send('Internal Server Error');
    }
});

// 启动服务器
app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

解释

  1. 导入模块: 我们使用 express 来设置 HTTP 服务器,使用 axios 来获取远程文件。
  2. 设置路由: 创建了一个 /download 路由,当用户访问这个路由时,会触发下载操作。
  3. 获取文件: 使用 axios 发起一个 GET 请求到指定的 URL,并设置响应类型为流。
  4. 设置响应头: 设置响应头以指示浏览器这是一个文件下载,并指定文件名和 MIME 类型。
  5. 发送文件流: 将从远程服务器获取的音频文件流直接通过 pipe() 方法传递给客户端。

这样,当你访问 http://localhost:3000/download 时,浏览器将提示你下载音频文件。

希望这能帮到你!如果你有任何问题或需要进一步的帮助,请告诉我。


简单来说就是实现下载URL文件的功能。。。

我之前认为的方法:

var dstUrl="http://10.0.2.246/monitor/2014-06-14/OUT7010-20140614-1402752806.1466.wav“;
        var input = fs.createReadStream(dstUrl);
        var result='';
        input.on('data',function(data){
            result+=data;
        });
        input.on('close',function(){
            res.setHeader('Content-Type', 'audio/x-wav');
            res.setHeader("Content-Disposition", "attachment; filename="test.wav");
            res.end(result, 'binary');
        })

但fs貌似只能读取本地文件

有人 帮我看下吗?

http.get下载

参考下这个吧。

var http = require('http');

http.createServer(function (req, res) { var internalReq = http.request({ // 下载资源 - 这里采用的是nodejs自带的http模块。可以考虑使用request模块 hostname: ‘10.0.2.246’, port: 80, path: ‘/monitor/2014-06-14/OUT7010-20140614-1402752806.1466.wav’, method: ‘GET’ }, function(internalRes) { res.setHeader(“Content-Disposition”, “attachment; filename=test.wav”); // 为了浏览器下载而设置的响应头 res.writeHead(internalRes.statusCode, internalRes.headers); // 将10.0.2.246给我们的响应头也给我们的客户端吧 internalRes.pipe(res); // 将10.0.2.246给我们的响应给我们的客户端 }); internalReq.end(); // 发送下载资源的请求 }).listen(3000, function () { // 我们的客户端监听在3000端口 console.log(‘server bound’); });

这些做法在[nodejs官网API页面](http://nodejs.org/api/都能看到。

res.download()

 res.setHeader("Content-Disposition", "attachment; filename=" + time+'-'+name);

不就是上面这句么。

‘Content-type’ : ‘application/octet-stream’

都不用做什么 ,直接给a标签一个download属性就ok了 简单粗暴的方法!!!

也可以用不直接写链接,然后用res.download的方式做。

对于你的问题,可以使用 httphttps 模块从远程URL获取音频文件,然后通过设置响应头将文件发送给客户端进行下载。以下是一个简单的示例:

const http = require('http');
const url = 'https://example.com/path/to/your/audiofile.wav';

http.createServer((req, res) => {
    // 设置响应头以触发文件下载
    res.setHeader('Content-disposition', 'attachment; filename=audiofile.wav');
    res.setHeader('Content-type', 'audio/wav');

    // 创建请求以从远程URL获取音频文件
    const fileRequest = http.get(url, (fileResponse) => {
        fileResponse.pipe(res);
    });

    // 处理错误
    fileRequest.on('error', (err) => {
        res.end(err.message);
    });
}).listen(3000, () => {
    console.log('Server is running on port 3000');
});

以上代码创建了一个简单的HTTP服务器,当访问该服务器时,会从指定的URL下载音频文件并将其作为附件发送给客户端,从而触发下载。

解释:

  1. 设置响应头Content-disposition: attachment; filename=audiofile.wav 告诉浏览器将接收到的数据视为文件,并建议将其保存为 audiofile.wav
  2. Content-type:设置为 audio/wav,告诉浏览器数据的 MIME 类型,以便正确处理音频文件。
  3. 创建请求:使用 http.get() 从远程URL获取音频文件。
  4. 管道操作:使用 pipe() 方法将文件数据流从文件请求直接传输到 HTTP 响应中,从而实现文件的下载。

请注意,这个例子假设了文件可以从指定的URL可靠地获取,并且没有处理文件大小限制或网络中断的情况。实际应用中可能需要增加错误处理和超时机制。

回到顶部