使用文件内容而不用 express.js 保存文件?
Consume content of the file without saving the file with express.js?
我正在编写一个可以上传 CVS 文件的应用程序。我有一个 CVS 解析器,所以我可以从我的前端将 CSV 文件上传到后端,对其进行处理并将其保存到数据库中。之后我要删除文件。
我正在使用 multer 接受文件并将其保存到硬盘驱动器,然后我可以读取文件并使用文件的内容并删除文件。那里一切都很好。
我想弄清楚是否有一种方法可以完全跳过实际保存文件。有没有一种简单的方法可以从 'multipart/form-data'
表单提交文件并直接使用 express 读取内容而无需将其保存在文件系统中?
仅供参考,这就是我现在所拥有的并且按预期工作
在前端:
static fileUpload(file) {
const url = '/api/statement-upload';
const formData = new FormData();
formData.append('file', file);
const config = {
headers: {
'content-type': 'multipart/form-data'
}
};
return post(url, formData, config);
}
在我的快速服务器上,我使用 multer 并定义了这样的路由:
import multer from 'multer';
export default function (router) {
const upload = multer({dest: 'uploads/'});
router.use('/api/statement-upload', upload.single('file'), (req, res) => {
cvsParser(req.file.path)
.then(() => res.json({error: false}))
.catch(e => res.json({error: e}));
});
return router;
};
然后在我的 cvsParser 中我有这个:
export default function (filePath) {
let content = fs.readFileSync(filePath, 'binary');
fs.unlink(filePath, () => {});
// do nasty stuff to content and save it gently in the database
}
简而言之,有没有一种方法可以做到这一点,而不必在我可以使用文件内容之前将 CSV 保存到文件系统?
考虑到文件编码等,这甚至可能吗,也许没有办法使用 fs
?
使用 multer 库,您可以将上传的文件存储在内存中,并将其用作缓冲区。在项目的自述文件中,您可以找到文档:github.com/expressjs/multer#memorystorage
当您不想将 csv 存储在文件系统中并读取内容时,可以这样做。在我的例子中,我必须将 csv 文件的内容作为字符串传递给另一台服务器(不保存在服务器的本地系统中)。
const multer = require('multer');
const upload = multer({ storage: multer.memoryStorage() })
app.post(
'/users/bulkUpload',
upload.single('csvFile'),
this.usersRoutes.uploadUserData
);
并在 uploadUserData()
中:
uploadUserData = async(
req: Request,
res: Response,
next: any
): Promise<any> => {
try {
const options = {
formData : {
'upload': String(req.file.buffer)
},
headers: {
authorization: req.token,
'Content-type': 'multipart/form-data'
},
json: true
};
const response = await this.http.post.exec(
'/somePostUrl/',
options
);
return res.status(200).json(response.body);
}catch (error) {
return next(error);
}
}
在这里,console.log(String(req.file.buffer))
会以字符串形式显示 csv 文件的内容。
希望对你有所帮助
var csvtojson = require("csvtojson");
app.post('/', async function (req, res) {
let sampleFile = req.files.yourUploadedCsvFileName.data.toString();
// convert it to JSON
const json_data=await csvtojson().fromString(sampleFile);
})
我正在编写一个可以上传 CVS 文件的应用程序。我有一个 CVS 解析器,所以我可以从我的前端将 CSV 文件上传到后端,对其进行处理并将其保存到数据库中。之后我要删除文件。
我正在使用 multer 接受文件并将其保存到硬盘驱动器,然后我可以读取文件并使用文件的内容并删除文件。那里一切都很好。
我想弄清楚是否有一种方法可以完全跳过实际保存文件。有没有一种简单的方法可以从 'multipart/form-data'
表单提交文件并直接使用 express 读取内容而无需将其保存在文件系统中?
仅供参考,这就是我现在所拥有的并且按预期工作
在前端:
static fileUpload(file) {
const url = '/api/statement-upload';
const formData = new FormData();
formData.append('file', file);
const config = {
headers: {
'content-type': 'multipart/form-data'
}
};
return post(url, formData, config);
}
在我的快速服务器上,我使用 multer 并定义了这样的路由:
import multer from 'multer';
export default function (router) {
const upload = multer({dest: 'uploads/'});
router.use('/api/statement-upload', upload.single('file'), (req, res) => {
cvsParser(req.file.path)
.then(() => res.json({error: false}))
.catch(e => res.json({error: e}));
});
return router;
};
然后在我的 cvsParser 中我有这个:
export default function (filePath) {
let content = fs.readFileSync(filePath, 'binary');
fs.unlink(filePath, () => {});
// do nasty stuff to content and save it gently in the database
}
简而言之,有没有一种方法可以做到这一点,而不必在我可以使用文件内容之前将 CSV 保存到文件系统?
考虑到文件编码等,这甚至可能吗,也许没有办法使用 fs
?
使用 multer 库,您可以将上传的文件存储在内存中,并将其用作缓冲区。在项目的自述文件中,您可以找到文档:github.com/expressjs/multer#memorystorage
当您不想将 csv 存储在文件系统中并读取内容时,可以这样做。在我的例子中,我必须将 csv 文件的内容作为字符串传递给另一台服务器(不保存在服务器的本地系统中)。
const multer = require('multer');
const upload = multer({ storage: multer.memoryStorage() })
app.post(
'/users/bulkUpload',
upload.single('csvFile'),
this.usersRoutes.uploadUserData
);
并在 uploadUserData()
中:
uploadUserData = async(
req: Request,
res: Response,
next: any
): Promise<any> => {
try {
const options = {
formData : {
'upload': String(req.file.buffer)
},
headers: {
authorization: req.token,
'Content-type': 'multipart/form-data'
},
json: true
};
const response = await this.http.post.exec(
'/somePostUrl/',
options
);
return res.status(200).json(response.body);
}catch (error) {
return next(error);
}
}
在这里,console.log(String(req.file.buffer))
会以字符串形式显示 csv 文件的内容。
希望对你有所帮助
var csvtojson = require("csvtojson");
app.post('/', async function (req, res) {
let sampleFile = req.files.yourUploadedCsvFileName.data.toString();
// convert it to JSON
const json_data=await csvtojson().fromString(sampleFile);
})