我试图编写一个将文件上传到S3位置的控制器。但是,在上传之前,我需要验证传入的文件类型是否为csv。然后我需要读取文件以检查文件中的标题列等。我得到了文件的类型,如下面的代码片段所示:
req.file('foo')._files[0].stream
但是,如何读取整个文件流并检查标题和数据等?还有其他类似的Q(如Sails.js Skipper: How to read the uploaded file stream during upload?)。但提到的解决方案是使用skipper-csv适配器(我不能使用它,因为我已经使用了skipper-s3上传到s3)。
有人可以在上传之前发布如何阅读上游并执行任何验证的示例吗?
答案 0 :(得分:0)
以下是我的问题如何解决的问题:我正在制作流的副本,以便在实际上传之前进行验证。然后检查原始流上的验证,一旦通过,我将复制的流上传到我想要的位置。
为了读取Csv流,我找到了一个npm包:csv-parser(https://github.com/mafintosh/csv-parser),我觉得它很容易处理标题,数据等事件。
为了创建流的副本,我使用了以下逻辑:
const upstream = req.file('file');
const fileStreamMap = {};
const fileStreamMapCopy = {};
_.each(upstream._files, (file) => {
const stream = PassThrough();
const streamCopy = PassThrough();
file.stream.pipe(stream);
file.stream.pipe(streamCopy);
fileStreamMap[fileName] = stream;
fileStreamMapCopy[fileName] = streamCopy;
});
// validate and upload files to S3, if Valid.
validateAndUploadFile(fileStreamMap, fileStreamMapCopy);
}
validateAndUploadFile()包含我的csv上传的自定义验证逻辑。
另外,我们可以使用aws-sdk(https://www.npmjs.com/package/aws-sdk)进行s3上传。 希望,这有助于某人。