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

Next.js生产模式下新增PDF文件出现404无法访问问题

问题原因

Next.js 在执行 yarn build 时,会将项目根目录 public 下的所有静态资源复制到构建产物目录(默认是 .next 文件夹下的静态资源分区)。当你启动 yarn start 时,服务是从构建产物目录加载静态资源,而非实时读取项目根目录的 public 文件夹。所以构建完成后手动添加到项目根目录 public 的 PDF 文件,并没有被同步到构建产物里,自然会返回 404。

解决方案

1. 重新构建并重启服务(生产环境首选)

把新增的 PDF 文件放到项目根目录的 public 文件夹后,重新执行:

yarn build && yarn start

新文件会被打包到构建产物中,即可通过浏览器路径正常访问。

2. 开发阶段用实时服务器(临时测试用)

如果只是临时需要访问新增文件,不想重新构建,可以切换到开发服务器:

yarn dev

开发服务器会实时监听 public 文件夹的变化,新增文件后刷新浏览器即可访问。

3. 自定义动态静态资源服务(运行时需动态添加文件的场景)

如果业务需要在生产运行时动态添加静态文件(无需每次重新构建),可以自定义 API 路由处理:

Pages Router 示例

创建 pages/api/static/[filename].js,代码如下:

import fs from 'fs';
import path from 'path';

export default function handler(req, res) {
  const { filename } = req.query;
  // 指定存放动态文件的目录,比如项目根目录下的 dynamic-public
  const filePath = path.join(process.cwd(), 'dynamic-public', filename);

  try {
    const fileBuffer = fs.readFileSync(filePath);
    res.setHeader('Content-Type', 'application/pdf');
    res.send(fileBuffer);
  } catch (err) {
    res.status(404).send('File not found');
  }
}

App Router 示例

创建 app/api/static/[filename]/route.js,代码如下:

import fs from 'fs';
import path from 'path';
import { NextResponse } from 'next/server';

export function GET(request, { params }) {
  const { filename } = params;
  const filePath = path.join(process.cwd(), 'dynamic-public', filename);

  try {
    const fileBuffer = fs.readFileSync(filePath);
    return new NextResponse(fileBuffer, {
      headers: {
        'Content-Type': 'application/pdf',
      },
    });
  } catch (err) {
    return new NextResponse('File not found', { status: 404 });
  }
}

使用时,把动态添加的 PDF 放到项目根目录的 dynamic-public 文件夹(需自行创建),访问路径为 /api/static/你的文件名.pdf。

内容的提问来源于stack exchange,提问作者Fabian Cardenas Aldana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:40:48