我正在嘗試提供我的 SvelteKit 應用程式生成的 PDF 檔案,并允許用戶從端點下載它。
我的專案結構如下所示:
---------------------
/src/routes/downloads
---------------------
[file].ts
ABC.pdf
XYZ.pdf
我的[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
}
}
因此,當我點擊時http://localhost:3000/downloads/ABC,名為ABC.pdf下載的 PDF 檔案。
但我的readFileSync道路不適用于生產。據我所知,沒有/src/routes檔案夾。
如何從http://localhost:3000url 提供我的檔案?我嘗試過的所有操作都會產生 a404并且找不到該檔案。我也對處理這種情況的不同方式持開放態度。這只是我對如何在 SvelteKit 中執行此操作的最佳猜測。
uj5u.com熱心網友回復:
對于 ,推薦的方法adapter-node是將應用程式資料放在專案根目錄下的新檔案夾中(即 和 旁邊/src)/static。然后,您可以讀取具有相對路徑的檔案:fs.readFile('./my-app-data/foo.txt').
對于部署,您只需要確保node build從專案根目錄執行,因為這可以保證您在開發和生產期間擁有相同的作業目錄。
該static檔案夾可以作業,但它并不意味著攜帶應用程式資料——該檔案夾中的檔案代表直接提供給用戶的新路由,因此如果您生成的檔案必須以任何方式受到保護,那么這是不可取的。即使它們是公共檔案,它仍然模糊了應該是生產資料和源資料的內容:新部署是否應該覆寫所有檔案static?如果您不小心,命名沖突可能意味著覆寫生產資料。
uj5u.com熱心網友回復:
正如@Stephane 建議的那樣,將您的檔案放在檔案statics夾下。這樣你就可以直接通過反向代理服務,比如 Nginx
uj5u.com熱心網友回復:
你可以用import.meta.glob這個。
export async function get({ params }){
const file = `./${params.file}.pdf`;
const pdfs = import.meta.glob(('./*.pdf', { as: 'raw' });
const pdf = pdfs[file];
return {
status:200,
headers: {
"Content-type" : "application/pdf",
"Content-Disposition": "attachment; filename=" params.file ".pdf"
},
body: pdf
}
}
與選項import.meta.glob結合使用將有效地將每個檔案的內容嵌入到生成的代碼中。(這純粹是服務器端,所以不用擔心向客戶端發送太多東西)as: 'raw'
請注意,這當然意味著只有在構建期間存在的檔案才能以這種方式提供服務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/474383.html
