我需要读取控制器中的CSV文件,以便将CSV文件数据添加到我的DB中。但我不知道怎么做。我找了那么多次的答案,但我找不到一个相关的问题的答案。我真的需要你的帮助。谢谢。
我的主计长方法:-
@Post()
@UseInterceptors(FileInterceptor('filename', { dest: './uploads' }))
async upload(@UploadedFile() files: Express.Multer.File) {
console.log(files);
}
我的控制台日志输出:-
发布于 2022-04-20 10:29:31
我刚刚完成了一个完全类似的场景。首先,我将csv文件上传到我的uploads/csv
目录中,名为“data.csv”。
我使用这个库将数据解析为JSON
https://www.npmjs.com/package/nest-csv-parser
这里是我的控制器文件的核心。
@Post('upload')
@UseInterceptors(FileInterceptor('file', {
storage: diskStorage({
destination: './uploads/csv',
filename: csvFileName,
}),
fileFilter: csvFileFilter,
}))
uploadFile(@UploadedFile() file: Express.Multer.File) {
const response = {
message: "File uploaded successfully!",
data: {
originalname: file.originalname,
filename: file.filename,
}
};
return response;
}
下面是我的组件app.module.ts的代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Coin } from './coin.entity';
import { CoinsController } from './coins.controller';
import { CoinsService } from './coins.service';
import {CsvModule} from "nest-csv-parser";
import {MulterModule} from "@nestjs/platform-express";
@Module({
imports: [
TypeOrmModule.forFeature([Coin]),
CsvModule,
MulterModule.register({
dest: './uploads/csv',
}),
],
controllers: [
CoinsController,
],
providers: [CoinsService]
})
export class CoinsModule { }
我还在utils或助手文件上创建了所有csv创建的逻辑
import {extname, join} from 'path';
export const csvFileFilter = (req, file, callback) => {
if (!file.originalname.match(/\.(csv)$/)) {
return callback(new Error('Only CSV files are allowed!'), false);
}
callback(null, true);
};
export const csvFileName = (req, file, callback) => {
//const name = file.originalname.split('.')[0];
const fileExtName = extname(file.originalname);
callback(null, `data${fileExtName}`);
};
export const getCSVFile = () => {
//const name = file.originalname.split('.')[0];
const filePath = join(__dirname, "..", "..", "uploads/csv", "data.csv");
return filePath;
};
export const editFileName = (req, file, callback) => {
const name = file.originalname.split('.')[0];
const fileExtName = extname(file.originalname);
const randomName = Array(4)
.fill(null)
.map(() => Math.round(Math.random() * 16).toString(16))
.join('');
callback(null, `${name}-${randomName}${fileExtName}`);
};
最后,我有一个不同的路径来导入或解析数据,然后我可以将它保存到数据库中。
// You have to define entity that is as 2nd argument of csvParsing and also a mendatory.
class Coin {
unix: number
date: string
symbol: string
open: number
close: number
high: number
low: number
"Volume BTC": number
"Volume USDT": number
tradecount: number
}
// An import end route
@Get('import')
async import(){
const csvPath = getCSVFile();
console.log(" => ", csvPath);
const stream = fs.createReadStream(csvPath)
const entities: Coin[] = await this.csvParser.parse(stream, Coin)
// You will get JSON
console.log(entities);
}
您可以在相同的控制器动作/upload
中这样做。尽管在我的场景中,我必须通过一个不同的API调用来完成它。
https://stackoverflow.com/questions/71257348
复制相似问题