如何从 SvelteKit 端点返回文件

Cli*_*rum 7 rest fs svelte sveltekit

我正在尝试提供我的 SvelteKit 应用程序生成的 PDF 文件,并允许用户从端点下载它。

我的项目结构如下所示:

---------------------
/src/routes/downloads
---------------------
[file].ts
ABC.pdf
XYZ.pdf
Run Code Online (Sandbox Code Playgroud)

我的[file].ts端点如下所示:

import fs from 'fs'

// ----- GET -----
export async function get({ params }){
  //console.log(params.file) -> ABC

  var pdf = fs.readFileSync('./src/routes/downloads/'+params.file+'.pdf')

  return{
    status:200,
    headers: {
      "Content-type" : "application/pdf",
      "Content-Disposition": "attachment; filename="+params.file+".pdf"
    },
    body: pdf
  }
}
Run Code Online (Sandbox Code Playgroud)

所以当我点击 时http://localhost:3000/downloads/ABC,名为 downloads 的 PDF 文件ABC.pdf

但我的readFileSync道路不适用于生产。据我所知,没有/src/routes文件夹。

如何通过http://localhost:3000URL 提供我的文件?我尝试过的所有方法都会产生 a404并且找不到该文件。我也愿意采用不同的方式来处理这种情况。这只是我对如何在 SvelteKit 中执行此操作的最佳猜测。

mrk*_*shi 10

对于 ,建议的方法adapter-node是将应用程序数据放置在项目根目录下的新文件夹中(即与/src和并列/static)。然后您可以使用相对路径读取文件:fs.readFile('./my-app-data/foo.txt')

\n

对于部署,您只需确保node build从项目根目录执行,因为这可以保证您在开发和生产期间拥有相同的工作目录。

\n

static文件夹可以工作,但它并不意味着携带应用程序数据\xe2\x80\x94 该文件夹中的文件代表直接向用户提供的新路由,因此如果必须以任何方式保护生成的文件,则这是不可取的。即使它们是公共文件,它仍然模糊了应该是生产和源数据的内容:新的部署是否应该覆盖 中的所有文件static?如果您不小心,命名冲突可能意味着覆盖生产数据。

\n