超级丶超 2019-04-29 14:22 采纳率: 0%
浏览 231

node处理post请求上传图片,为什么会写两个图片,readfile的时候已经创建了一个图片文件

图片说明

var upload = multer({
    dest: 'upload/'
});

router.post('/', upload.any(), function (req, res, next) {
    console.log('上传的文件')
    console.log(req.files[0]); // 上传的文件信息
    var extName = ''; //后缀名
    switch(req.files[0].mimetype) {
        case 'image/pjpeg':
        extName = '.jpg';
        break;
      case 'image/jpeg':
        extName = '.jpg';
        break;
      case 'image/png':
        extName = '.png';
        break;
      case 'image/x-png':
        extName = '.png';
        break;
        default :
        extName = ''
    }
    var des_file = "/" + req.files[0].originalname;
    fs.readFile(req.files[0].path, function (err, data) {
        console.log(data)
        fs.writeFile(req.files[0].path+extName, data, function (err) {
            if (err) {
                console.log("失败")
                console.log(err);
            } else {
                response = {
                    message: 'File uploaded successfully',
                    filename: req.files[0].originalname
                };
                console.log(response);
                res.end(JSON.stringify(response));
            }
        });
    });
});

  • 写回答

1条回答 默认 最新

  • 万水千山走遍TML 2024-07-15 17:58
    关注

    在你提供的代码中,确实存在一个问题,导致图片被写入两次,但其中一次可能是不必要的或者错误的。问题出在文件写入逻辑上。具体来说,问题出现在以下部分:

    javascript
    fs.readFile(req.files[0].path, function (err, data) {  
        console.log(data)  
        fs.writeFile(req.files[0].path+extName, data, function (err) {  
            ...  
        });  
    });
    

    这里,你首先读取了上传的文件,然后又将其写入到相同的路径,但是添加了文件扩展名。这意味着:

    文件首先被Multer上传到upload/目录下,此时的文件名可能不包含扩展名。
    然后,你读取这个文件,并尝试将其写入到相同的路径,但是文件名后面加上了扩展名。
    这实际上导致了两个动作:

    文件被上传到服务器。
    文件被再次写入,这次带上了扩展名。
    如果你的目的是确保文件名包含扩展名,你应该在文件第一次被写入时就指定正确的文件名,而不是读取后再写入。你可以通过修改Multer的配置来实现这一点,例如:

    var upload = multer({  
        dest: 'upload/',  
        filename: function (req, file, cb) {  
            var extName = '';  
            switch(file.mimetype) {  
                case 'image/pjpeg':  
                case 'image/jpeg':  
                    extName = '.jpg';  
                    break;  
                case 'image/png':  
                case 'image/x-png':  
                    extName = '.png';  
                    break;  
                default:  
                    extName = '';  
            }  
            cb(null, file.fieldname + '-' + Date.now() + extName);  
        }  
    });
    
    

    这样,文件在第一次被写入时就会包含正确的扩展名,无需再次读取和写入。

    评论

报告相同问题?