Sveltekit使用adapter-node适配器上传文件失败的解决办法

在sveltekit上传文件的时候如果使用adapter-node并且通过Api Endpoint中转发往Api服务器需要注意BODY_SIZE_LIMIT变量,由于该值默认只有512KB,因此所有超过该值的文件都无法上传。

BODY_SIZE_LIMIT

流式传输时接受的最大请求正文大小(以字节为单位)。正文大小也可以用千字节 ( K)、兆字节 ( M) 或千兆字节 ( G) 的单位后缀来指定。例如,512K或1M。默认为 512kb。您可以使用值Infinity(旧版本的适配器中为 0)禁用此选项,并实现自定义检查(handle如果您需要更高级的功能)。

https://svelte.dev/docs/kit/adapter-node#environment-variables-body-size-limit

除此之外,您还应该注意

  1. sveltekit端nginxclient_max_body_size参数
  2. Api服务端的nginx及相关应用的上传限制参数,以directus为例,需要注意FILES_MAX_UPLOAD_SIZE参数。

20250413补充

该参数添加在.env文件中。需要注意的是如果在sveltekit.config.jskit配置区添加了envPrefix参数,则需要在前面加上前缀。

比如我的sveltekit.config.js

	kit: {
		adapter: adapter({
			out: 'build',
			precompress: true,
			envPrefix: 'RUN_'
		})
	}

那么.env文件则需要添加RUN_BODY_SIZE_LIMIT=10M

Read Comments

  • ycqq4 days ago0

    请问您这个BODY_SIZE_LIMIT是在哪个文件修改?我在本地mac,通过build后,node index.js出现这个提示。

    • Julien3 days ago0

      在生产环境中的.env文件添加该参数。以我的项目为例:
      .env文件中加入参数:
      RUN_BODY_SIZE_LIMIT=10M

      这是由于svelte.config.js文件加了RUN_前缀:
      kit: {
      adapter: adapter({
      out: 'build',
      precompress: true,
      envPrefix: 'RUN_'
      })
      }

      • ycqq3 days ago0

        我在.env加入BODY_SIZE_LIMIT=Infinity ,我的没有前缀,还是提示限制512k,我改为10M再试试,感谢感谢

  • Julien3 days ago0

    You can disable this option with a value of Infinity (0 in older versions of the adapter) and implement a custom check in handle if you need something more advanced.

    注意适配器版本哈,旧版本要设置为 0

    另外同时要注意服务端软件(nginx)的文件上传和BODY SIZE的大小限制。

    祝顺利。

    • ycqq3 days ago0

      我在本地没有nginx,测试了改为0和50M都还是不行。以下是我使用的一些版本
      "scripts": {
      "dev": "vite dev --host",
      "build": "vite build",
      "preview": "vite preview",
      "start": "HOST=localhost PORT=5173 node build"
      },
      "devDependencies": {
      "@fontsource/fira-mono": "^5.0.0",
      "@neoconfetti/svelte": "^2.0.0",
      "@rollup/plugin-commonjs": "^28.0.3",
      "@sveltejs/adapter-auto": "^3.0.0",
      "@sveltejs/adapter-node": "^5.2.12",
      "@sveltejs/kit": "^2.20.2",
      "@sveltejs/vite-plugin-svelte": "^4.0.0",
      "autoprefixer": "^10.4.20",
      "postcss": "^8.4.47",
      "svelte": "^5",
      "tailwindcss": "^3.4.14",
      "vite": "5.3.5"
      },

      • ycqq3 days ago1

        可以了,原来少了这一步
        node --env-file=.env build
        所以我改env根本没有效果。。感谢

  • ycqq3 days ago1

    还有要 npm install dotenv 安装这个依赖,希望能帮到后来的人。。

    • Julien3 hours ago0

      啊,我也给忘记了这茬,Node.js 默认不会读取 .env 文件并把内容放进process.env,这事得靠dotenv

      非常感谢您的反馈。

Post Comment