You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS读取数据库存储URL对应文件失败,浏览器可正常访问

Node.js无法读取URL路径文件的原因与解决方法

问题原因

  • Node.js的fs模块是本地文件系统操作工具,只能读取本地磁盘的文件路径(比如./assets/xxx.pdf相对路径、/opt/files/xxx.pdf绝对路径),完全不支持直接读取HTTP/HTTPS URL。你传入的http://localhost:8000/assets/xxx.pdf会被当作本地文件路径查找,自然找不到对应文件,所以抛出ENOENT错误。
  • 浏览器能正常访问是因为浏览器会向服务器发送HTTP请求,由服务器解析URL后返回文件内容,这和本地文件系统读取是完全不同的机制。

解决办法

方式1:使用本地文件路径读取(推荐,若文件在本地项目中)

直接替换为本地相对或绝对路径,同时注意PDF是二进制文件,不要用utf-8编码读取:

const fs = require('fs');

// 假设assets目录在项目根目录下
const localFilePath = './assets/uploadNk2i8BAE81Wp6pFI6TtF-.pdf';
try {
  // 同步读取(无回调,直接返回结果)
  const pdfBuffer = fs.readFileSync(localFilePath);
  res.setHeader('Content-Type', 'application/pdf');
  res.send(pdfBuffer);
} catch (err) {
  res.send(err);
}

// 或者用异步版本(带回调)
fs.readFile(localFilePath, (err, pdfBuffer) => {
  if (err) {
    res.send(err);
  } else {
    res.setHeader('Content-Type', 'application/pdf');
    res.send(pdfBuffer);
  }
});

方式2:通过HTTP请求获取(若文件由远程/其他本地服务提供)

如果文件是通过另一个HTTP服务提供的(哪怕是本地8000端口的服务),需要用HTTP客户端发送请求获取内容,比如用Node.js内置的http模块:

const http = require('http');

http.get('http://localhost:8000/assets/uploadNk2i8BAE81Wp6pFI6TtF-.pdf', (resFromServer) => {
  let pdfChunks = [];
  resFromServer.on('data', (chunk) => pdfChunks.push(chunk));
  resFromServer.on('end', () => {
    const pdfBuffer = Buffer.concat(pdfChunks);
    res.setHeader('Content-Type', 'application/pdf');
    res.send(pdfBuffer);
  });
}).on('error', (err) => {
  res.send(err);
});

额外代码纠正

你原代码里的fs.readFileSync是同步方法,不支持传入回调函数,同步方法会直接返回结果,出错时抛出异常,需要用try/catch捕获错误;如果想用回调,应该使用异步的fs.readFile方法。

内容的提问来源于stack exchange,提问作者Zain763

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:40:28