
Nuxt 3 项目中,将用户上传的文件直接存储在 public 目录下,期望构建后可以直接通过 URL 访问,但实际情况是,虽然 favicon.ico 等静态资源可以正常访问,新上传的文件却会报 404 错误。这是因为 Nuxt 3 对 public 目录的处理方式有所不同,它更倾向于将 public 目录视为静态资源目录,不期望其中的内容在运行时发生变化。
解决方案:构建 API 接口提供文件服务
为了解决这个问题,我们可以构建一个 API 接口来提供文件服务,而不是直接让 Nuxt 服务 public 目录下的文件。
1. 创建 API 路由
在 server/api 目录下创建一个 API 路由,例如 server/api/files/[filename].ts。
import { defineEventHandler } from 'h3'
import fs from 'node:fs'
import path from 'node:path'
export default defineEventHandler((event) => {
const filename = event.context.params?.filename
const filePath = path.join('public', 'uploads', filename || '') // 假设文件存储在 public/uploads 目录下
if (!filename || !fs.existsSync(filePath)) {
throw createError({
statusCode: 404,
statusMessage: 'File not found',
})
}
const file = fs.readFileSync(filePath)
setHeaders(event, {
'Content-Type': 'image/png', // 根据文件类型设置 Content-Type
})
return file
})代码解释:
2. 修改上传逻辑
修改文件上传逻辑,将文件存储到 public/uploads 目录下。
// 示例代码,需要根据你的实际上传逻辑进行修改
async function handleFileUpload(file: File) {
const filename = `${Date.now()}-${file.name}`;
const filePath = path.join('public', 'uploads', filename);
const buffer = await file.arrayBuffer();
const fileData = new Uint8Array(buffer);
fs.writeFileSync(filePath, fileData);
return filename; // 返回文件名,用于后续访问
}3. 前端访问文件
使用 API 接口访问上传的文件。
<template>
<img :src="imageUrl" alt="Uploaded Image">
</template>
<script setup>
import { ref, onMounted } from 'vue';
const filename = ref('');
const imageUrl = ref('');
onMounted(async () => {
// 假设你已经获取到了上传后的文件名
filename.value = '1678886400000-example.png'; // 替换为实际的文件名
imageUrl.value = `/api/files/${filename.value}`;
});
</script>注意事项:
总结:
通过构建 API 接口来提供文件服务,可以有效地解决 Nuxt 3 项目中上传文件后 public 目录无法访问的问题。这种方式更加灵活,可以更好地控制文件的访问权限和处理方式。虽然需要额外编写 API 接口,但从长远来看,这种方案更加可靠和可维护。
以上就是Nuxt 3 上传文件后 Public 目录无法访问的解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号