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

Next.js项目获取public文件夹图片文件名失败,返回空数组求助

问题描述

我用Next.js构建SPA,需要为ImageGallery组件把public/photos文件夹下的图片文件名加载成如下格式的数组:

[
 {
  original: "photos/DSC_0958.jpg"
 },
 {
  original: "photos/DSC_0958.jpg"
 }
]

但运行以下代码后始终返回空数组,完整代码如下:

import path from "path";
import React from "react";

export async function getStaticProps() {
  const photosDirectory = path.join(process.cwd(), "public", "photos");

  const filenames = fs.readdirSync(photosDirectory);

  const photos = filenames.map((filename) => ({
    original: `photos/${filename}`,
  }));

  return {
    props: {
      photos,
    },
  };
}

export default function Index({ photos = [] }) {
  return (
    <div>
      {photos.length > 0 ? (
        photos.map((photo, index) => <p key={index}>{photo}</p>)
      ) : (
        <p>No photos found </p>
      )}
    </div>
  );
}

工作区目录结构:项目根目录下存在public文件夹,其内部包含photos子文件夹,该子文件夹中存放有多张JPG格式的图片文件。


问题修复方案

1. 补充fs模块导入

代码中调用了fs.readdirSync但未导入Node.js的fs模块,这会导致运行时错误,直接终止getStaticProps的执行,最终返回空数组。需在文件顶部添加:

import fs from "fs";

2. 修正渲染逻辑

当前代码在map中直接渲染photo对象,React无法直接解析对象,会显示[object Object]。需改为渲染对象的original属性:

photos.map((photo, index) => <p key={index}>{photo.original}</p>)

3. 可选优化:过滤非图片文件

如果photos文件夹中存在非图片格式的文件,可通过正则过滤只保留图片:

const photos = filenames
  .filter(filename => /\.(jpg|jpeg|png|gif)$/i.test(filename))
  .map((filename) => ({
    original: `photos/${filename}`,
  }));

4. 可选优化:添加目录存在性检查

避免因photos目录不存在导致的报错,可在读取目录前增加判断:

if (!fs.existsSync(photosDirectory)) {
  return { props: { photos: [] } };
}

修复后的完整代码

import fs from "fs";
import path from "path";
import React from "react";

export async function getStaticProps() {
  const photosDirectory = path.join(process.cwd(), "public", "photos");

  if (!fs.existsSync(photosDirectory)) {
    return { props: { photos: [] } };
  }

  const filenames = fs.readdirSync(photosDirectory);

  const photos = filenames
    .filter(filename => /\.(jpg|jpeg|png|gif)$/i.test(filename))
    .map((filename) => ({
      original: `photos/${filename}`,
    }));

  return {
    props: {
      photos,
    },
  };
}

export default function Index({ photos = [] }) {
  return (
    <div>
      {photos.length > 0 ? (
        photos.map((photo, index) => <p key={index}>{photo.original}</p>)
      ) : (
        <p>No photos found </p>
      )}
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:13:17