Nodejs求助:有一个url链接的音频文件,直接打开是直接播放,现在我需要写一个接口,提供下载该wav文件,怎么做?
Nodejs求助:有一个url链接的音频文件,直接打开是直接播放,现在我需要写一个接口,提供下载该wav文件,怎么做?
fs 模块貌似只能读取本地上的文件。。求大神们帮忙有什么好的办法没有?
当然可以!你可以使用 http
或 https
模块来获取远程音频文件,并通过 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}`);
});
解释
- 导入模块: 我们使用
express
来设置 HTTP 服务器,使用axios
来获取远程文件。 - 设置路由: 创建了一个
/download
路由,当用户访问这个路由时,会触发下载操作。 - 获取文件: 使用
axios
发起一个 GET 请求到指定的 URL,并设置响应类型为流。 - 设置响应头: 设置响应头以指示浏览器这是一个文件下载,并指定文件名和 MIME 类型。
- 发送文件流: 将从远程服务器获取的音频文件流直接通过
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貌似只能读取本地文件
有人 帮我看下吗?
参考下这个吧。
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的方式做。
对于你的问题,可以使用 http
或 https
模块从远程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下载音频文件并将其作为附件发送给客户端,从而触发下载。
解释:
- 设置响应头:
Content-disposition: attachment; filename=audiofile.wav
告诉浏览器将接收到的数据视为文件,并建议将其保存为audiofile.wav
。 - Content-type:设置为
audio/wav
,告诉浏览器数据的 MIME 类型,以便正确处理音频文件。 - 创建请求:使用
http.get()
从远程URL获取音频文件。 - 管道操作:使用
pipe()
方法将文件数据流从文件请求直接传输到 HTTP 响应中,从而实现文件的下载。
请注意,这个例子假设了文件可以从指定的URL可靠地获取,并且没有处理文件大小限制或网络中断的情况。实际应用中可能需要增加错误处理和超时机制。