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

SvelteKit生产环境下无法存储客户端上传保密文件的问题排查

问题分析与解决方案

核心错误点

  1. 相对路径的不确定性:开发环境中代码执行目录是项目根目录,./private/files/products/能找到对应路径;但生产环境执行npm run build后,代码被打包到build目录,Node.js进程的执行目录可能是build文件夹或其他位置,导致相对路径指向不存在的目录。
  2. 私有目录规划错误:SvelteKit默认不会将private目录打包到生产构建产物中,且即使手动配置,将敏感文件存放在构建目录内也存在被客户端访问的风险(Nginx会把构建目录作为web根目录,权限配置不当可能暴露文件)。

解决步骤

1. 规划安全存储目录

在Web根目录的父级创建独立私有存储目录,比如假设Nginx配置的web根目录为/var/www/my-app/build,则在/var/www/my-app/下创建private-files/products/,该目录不在Nginx服务范围内,客户端无法直接访问。

2. 用绝对路径 + 环境变量适配多环境

避免硬编码路径,通过环境变量区分开发/生产环境:

  • 在项目根目录创建.env(生产)和.env.development(开发)文件:
    # .env(生产环境)
    PRIVATE_FILES_DIR=/var/www/my-app/private-files/products/
    
    # .env.development(开发环境)
    PRIVATE_FILES_DIR=./private/files/products/
    
  • 在vite.config.js中配置允许读取私有环境变量:
    import { sveltekit } from '@sveltejs/kit/vite';
    import { defineConfig } from 'vite';
    
    export default defineConfig({
      plugins: [sveltekit()],
      envPrefix: 'PRIVATE_' // 允许服务器端代码读取以PRIVATE_开头的环境变量
    });
    

3. 修改上传代码,添加校验与错误处理

替换相对路径为环境变量提供的绝对路径,确保目录存在并处理写入错误:

import { writeFile, mkdir } from 'fs/promises';
import { env } from '$env/dynamic/private';

// 示例:服务器端路由(如src/routes/api/upload/+server.js)
export async function POST({ request }) {
  const formData = await request.formData();
  const file = formData.get('file');
  const fileId = '你的文件ID生成逻辑';

  const storageDir = env.PRIVATE_FILES_DIR;
  // 递归创建目录(不存在则自动创建)
  await mkdir(storageDir, { recursive: true });

  try {
    await writeFile(`${storageDir}${fileId}`, file.stream());
    return new Response(JSON.stringify({ success: true }), { status: 200 });
  } catch (err) {
    console.error('文件存储失败:', err);
    return new Response(JSON.stringify({ success: false, error: '文件上传失败' }), { status: 500 });
  }
}

4. 配置目录权限

确保Node.js进程对存储目录有读写权限:

# 假设Node.js运行用户为nodejs
sudo chown -R nodejs:nodejs /var/www/my-app/private-files/
sudo chmod -R 750 /var/www/my-app/private-files/

关键注意事项

  • 禁止将敏感文件存放在Nginx的web根目录(即SvelteKit的build目录)下,避免客户端直接访问。
  • 环境变量中的路径必须是绝对路径,防止进程执行目录变化导致路径失效。
  • 务必添加错误处理逻辑,原代码中空的if (err) {}会掩盖存储失败问题,不利于排查。

内容的提问来源于stack exchange,提问作者Mike Casan Ballester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:43:12