首页 > 解决方案 > 如何从节点js中的缓冲区中找到损坏的文件

问题描述

实际上我从 apolloGraphQl 上传了一个文件,然后我在 createReadStream 中有一个文件,这是它的承诺。现在我想在保存之前确保这个文件是图像。如何知道该文件没有损坏?

这是我的节点 js 代码:

const fs = require('fs');
const path = require('path');
const mkdirp = require('mkdirp');
const FileType = require('file-type');

 let UploadAvatar = async(_ , args) => {

    //save image function
    let saveImage = ({stream, extention}) => {
        const dir = `../public/avatar`;
        const date = `${new Date().getTime()}`;

        mkdirp.sync(path.join(__dirname, `${dir}`));
        const filePath = `${dir}/${date}.${extention}`;

        return new Promise((resolve, reject) => {
            stream
                .pipe(fs.createWriteStream(path.join(__dirname, `${filePath}`)))
                .on(`error`,error => reject({error}))
                .on('finish', () => resolve({filePath}))
        })
    }
  
    const {createReadStream, mimetype} = await args.image;
    const stream = createReadStream();
    //get extention 
    const extention = mimetype.split('/').pop();
    //save file
    const { filePath } = await saveImage({ stream, extention});

    console.log(filePath);

} 
module.exports = UploadAvatar;

保存文件工作正常。但我也可以保存损坏的文件!

还有一点我不得不提的是:我通过 react apollo-upload-client 上传文件。然后 args.image 变量内容:

args.image =  {
      filename: 'fileName',
      mimetype: 'image/jpeg',
      encoding: '7bit',
      createReadStream: [Function: createReadStream]
    }

这种 mimetype 不可靠。

标签: javascriptnode.js

解决方案


推荐阅读