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

SvelteKit-Node网站部署后动态展示FTP上传图片的方案咨询

解决方案:SvelteKit-Node展示动态FTP上传图片

方案1:SvelteKit原生服务端端点+静态资源映射

步骤1:创建服务端API获取图片列表

在src/routes/api/images/+server.js中编写端点代码,实时读取FTP图片目录:

import { readdir } from 'node:fs/promises';
import { join } from 'node:path';

export async function GET() {
  // 替换为服务器上FTP图片目录的绝对路径
  const imageDir = join(process.cwd(), '../ftp-uploaded-images');
  try {
    const files = await readdir(imageDir);
    // 过滤仅保留图片格式文件
    const imageFiles = files.filter(file => /\.(jpg|jpeg|png|gif|webp)$/i.test(file));
    // 生成可访问的图片URL(后续通过静态映射暴露)
    const imageUrls = imageFiles.map(file => `/dynamic-images/${file}`);
    return new Response(JSON.stringify(imageUrls), {
      headers: { 'Content-Type': 'application/json' }
    });
  } catch (err) {
    return new Response(JSON.stringify({ error: err.message }), { status: 500 });
  }
}

步骤2:配置静态资源映射

修改svelte.config.js,将FTP图片目录映射为SvelteKit的静态资源路径,让前端能直接访问图片:

import adapterNode from '@sveltejs/adapter-node';

/** @type {import('@sveltejs/kit').Config} */
const config = {
  kit: {
    adapter: adapterNode(),
    static: {
      external: [
        {
          path: '/dynamic-images', // 前端访问路径
          resolve: () => '/var/ftp/uploads/images' // 服务器上FTP图片的绝对路径
        }
      ]
    }
  }
};

export default config;

步骤3:前端获取并监听更新

在页面组件(如+page.svelte)中,通过API拉取图片列表,并结合WebSocket触发更新:

<script>
  import { onMount } from 'svelte';
  let images = [];

  // 拉取最新图片列表
  async function loadImages() {
    const res = await fetch('/api/images');
    images = await res.json();
  }

  onMount(async () => {
    await loadImages();
    // 监听WebSocket消息,收到更新通知时重新加载
    const ws = new WebSocket('ws://your-server-address/ws');
    ws.onmessage = (event) => {
      // 假设Python发送的更新标识为'images-updated'
      if (event.data === 'images-updated') {
        loadImages();
      }
    };
  });
</script>

<div class="image-gallery">
  {#each images as imgUrl}
    <img src={imgUrl} alt="Uploaded image" />
  {/each}
</div>

方案2:集成Express扩展服务端能力(适合更复杂场景)

如果需要更灵活的服务端控制,可将SvelteKit与Express集成:

步骤1:安装依赖

npm install express

步骤2:创建Express服务入口文件server.js

import express from 'express';
import { handler } from './build/handler.js';
import { readdir } from 'node:fs/promises';
import { join } from 'node:path';

const app = express();
const PORT = process.env.PORT || 3000;

// 暴露FTP图片目录为静态资源
const ftpImageDir = '/var/ftp/uploads/images'; // 替换为你的FTP目录路径
app.use('/dynamic-images', express.static(ftpImageDir));

// 自定义API端点返回图片列表
app.get('/api/images', async (req, res) => {
  try {
    const files = await readdir(ftpImageDir);
    const imageFiles = files.filter(file => /\.(jpg|jpeg|png|gif|webp)$/i.test(file));
    const imageUrls = imageFiles.map(file => `/dynamic-images/${file}`);
    res.json(imageUrls);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 让Express处理SvelteKit的路由
app.use(handler);

app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

步骤3:修改启动脚本

更新package.json中的启动命令,改为运行Express服务:

{
  "scripts": {
    "start": "node server.js"
  }
}

关键注意事项

  • 确保Node进程拥有读取FTP图片目录的权限,避免权限错误。
  • 完全抛弃import.meta.glob,因为它是构建时静态分析工具,无法获取部署后的动态文件。
  • 方案支持文件名动态变化,每次API请求都会实时读取目录内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:52:45