node.js - Sveltekit 端点返回文件共享网站的文件

标签 node.js blob sveltekit file-sharing

我想建立一个类似于 nextcloud 的文件共享网站。 这个想法是,它们是服务器上的文件(当前它们是本地的),svelte 后端解析它们并呈现它们。然后,您可以单击文件夹来查找所需的文件,当您单击某个文件时,您可以下载该文件。

现在解析目录工作得很好。 但我似乎无法弄清楚如何创建返回文件以供下载的端点。

这些文件不应该是 sveltekit 的一部分,因此它们不是静态文件,因此我不能通过指向它们的 URL 来下载它们。

所以我尝试根据文件类型创建一个 blob,但我似乎无法弄清楚它是如何工作的。

这就是我到目前为止所拥有的端点。

import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import fs from "fs";
import { resolve } from 'path';

export const GET = (async (event) => {
    const filePath = resolve("."+event.url.pathname);
    console.log(filePath);
    var file = fs.readFileSync(filePath);

    return json({
        status:200,
        headers: {
        "Content-type" : "application/pdf",
        "Content-Disposition": `attachment; filename=${event.url.pathname.split("/").pop()}`
        },
        body: file
    });
}) satisfies RequestHandler;

最佳答案

您不会返回 JSON,即基于结构化文本的数据,而是返回一个原始 Response 对象,其中可以包含您想要的任何内容。

原始二进制数据的内容类型应为application/octet-stream。我也只是将文件作为查询字符串参数传递。例如

export const GET: RequestHandler = async ({ url }) => {
    const name = url.searchParams.get('name'); // E.g. /files/download?name=X
    if (name == null)
        return new Response('No name provided', { status: 500 });

    const buffer = await readFile(`./files/${name}`);

    return new Response(
        buffer,
        {
            status: 200,
            headers: {
                'Content-Type': 'application/octet-stream',
                'Content-Disposition':
                    // Use filename* instead of filename to support non-ASCII characters
                    `attachment; filename*=UTF-8''${encodeURIComponent(name)}`,
            },
        }
    );
};

在使用 encodeURIComponent 构建页面 URL 或使用 URL 构建 URL 时,请确保对 name 查询参数值进行编码类(class)。例如

{#each data.files as file}
  <a href="/files/download?name={encodeURIComponent(file)}">
    {file}
  </a>
{/each}

关于node.js - Sveltekit 端点返回文件共享网站的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75327063/

相关文章:

javascript - 尝试运行 Electron 应用程序时找不到模块应用程序

node.js - 严重依赖项中的警告 : require function is used in a way in which dependencies cannot be statically extracted

javascript - BLOB URL 在 Safari 中不起作用

php - 将图像存储在数据库中与存储在文件系统中

oracle - 如何使用存储过程将文件读入 oracle 数据库

rust - 将 SvelteKit 静态部署到 Actix

node.js - 查询 MongoDB 嵌套字段

javascript - 具有小图形的 Neo4J 在 Ubuntu 16.04 上使用大量内存

javascript - 如何在 sveltekit 应用程序中将菜单项设置为事件状态

svelte - Svelte 中是否可以有重叠的页面转换?