将文件写入文件系统后是否可以使用 res.download() ?
router.get('/exportjson', (req, res, next) => {
let json = `{"@dope":[{"set":"","val":"200"}],"comment":"comment","folderType":"window"}`
const file = `${__dirname}/upload-folder/export.JSON`;
fs.writeFile('file', json, 'application/json', function(){
res.download(file);
})
})
最佳答案
我不确定我是否完全理解您的问题,但我假设您希望能够将该 json 数据保存到路径 /upload-folder/export.json
中,然后允许浏览器使用 res.download()
在路径 GET/exportjson
处下载文件。
您有几个问题。首先,fs.writeFile
将文件路径作为第一个参数,并且您只需传递字符串file
。使用您的代码,数据将作为 file
写入当前目录。您可能想使用 path
模块并创建您要写入的文件的路径,如下所示:
const path = require('path');
const jsonFilePath = path.join(__dirname, '../upload-folder/export.json');
假设代码位于routes/index.js
,该路径将指向文件upload-folder/export.json
的项目根目录。
您要写入的数据位于变量 json
中,但您将其存储为字符串。我实际上会将它保留为一个对象:
let json = {
"@dope": [
{
"set":"",
"val":"200"
}
],
"comment":"comment",
"folderType":"window"
};
然后,当您将其作为第二个参数传递给 fs.writeFile
时,对其调用 JSON.stringify
。您还需要传入 utf-8
选项作为第三个参数,而不是 application/json
:
fs.writeFile(jsonFilePath, JSON.stringify(json), 'utf-8', function(err) {
在对 fs.writeFile
的回调中,您想要调用 res.download
并将其传递给您刚刚写入文件系统的文件的路径,即存储在 jsonFilePath 中(这部分你是对的,我只是更改了变量名称):
res.download(jsonFilePath);
这是路由器文件的相关部分,其中包含使一切正常工作的代码:
const fs = require('fs');
const path = require('path');
const jsonFilePath = path.join(__dirname, '../upload-folder/export.json');
router.get('/exportjson', (req, res, next) => {
let json = {
"@dope": [
{
"set":"",
"val":"200"
}
],
"comment":"comment",
"folderType":"window"
};
fs.writeFile(jsonFilePath, JSON.stringify(json), 'utf-8', function(err) {
if (err) return console.log(err);
res.download(jsonFilePath);
});
});
假设此文件位于 /routes/index.js
中,该文件将保存在 /upload-folder/export.json
中。
这是一个 gif,展示了它在我的机器上的外观:
关于javascript - 将文件写入文件系统,然后在 Express 中下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59384663/