【问题标题】:Overwriting files in Node server覆盖节点服务器中的文件
【发布时间】:2018-11-21 16:43:00
【问题描述】:

所以我有一个服务器,在我将文件上传到数据库之前,它会暂时将文件保存在它的内存中。这是我的代码:

uploadImage(file, uid, res) {
    var fs = require('fs');
    mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e));
    var conn = mongoose.connection;
    Grid.mongo = mongoose.mongo;
    const gfs = Grid(conn.db);
    const writeStream = gfs.createWriteStream({
        filename: file.filename,
    });
    fs.createReadStream(file.path).pipe(writeStream);
    writeStream.on('close', file => {
        const {_id} = file;
        return Account.findByIdAndUpdate(uid, {'employer.logo': _id}).then(() => res.redirect('/employer')).catch(e => console.log(e));
    });
},

我正在尝试在将图像上传到数据库之前对其进行优化,如下所示:

async uploadImage(file, uid, res) {
    const imagemin = require('imagemin');
    const imageminJpegtran = require('imagemin-jpegtran');
    const imageminPngquant = require('imagemin-pngquant');
    console.log(1);
    // const newFilePath = `${file.path}optimized`;
    const newFile = await imagemin([file.path], file.path, {
        plugins: [
            imageminJpegtran(),
            imageminPngquant({quality: '65-80'})
        ]
    });
    // newFile.path = newFilePath;
    console.log(2);
    console.log(file);
    console.log(newFile);
    var fs = require('fs');
    await mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e));
    var conn = mongoose.connection;
    Grid.mongo = mongoose.mongo;
    const gfs = Grid(conn.db);
    const writeStream = gfs.createWriteStream({
        filename: newFile.filename,
    });
    fs.createReadStream(newFile.path).pipe(writeStream);
    writeStream.on('close', file => {
        const {_id} = file;
        return Account.findByIdAndUpdate(uid, {'employer.logo': _id}).then(() => res.redirect('/employer')).catch(e => console.log(e));
    });
},

但这告诉我EEXIST: file already exists, mkdir '/home/alex/Documents/Projects/ontario-job-portal/public/images/logos/b80872b65d18d09bb498abcabe2f3f94',这是真的。我正在尝试覆盖以前的图像。

我怎样才能让它覆盖文件呢?

创建新文件会导致权限被拒绝错误。

编辑。 重要

事实证明,imagemin 函数返回的对象与前一个对象略有不同。这是我的工作代码:

async uploadImage(file, uid, res) {
    const imagemin = require('imagemin');
    const imageminJpegtran = require('imagemin-jpegtran');
    const imageminPngquant = require('imagemin-pngquant');
    console.log(1);
    const path = require("path");
    const newFilePath = path.dirname(file.path);
    const newFile = await imagemin([file.path], path.dirname(file.path), {
        plugins: [
            imageminJpegtran(),
            imageminPngquant({quality: '65-80'})
        ]
    });
    newFile.path = newFilePath;
    newFile.filename = newFile[0].path.replace(/public\/images\/logos\//, '');
    console.log(newFile.filename);
    var fs = require('fs');
    await mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e));
    var conn = mongoose.connection;
    Grid.mongo = mongoose.mongo;
    const gfs = Grid(conn.db);
    console.log(2);
    const writeStream = gfs.createWriteStream({
        filename: newFile[0].filename,
    });
    console.log(3);
    fs.createReadStream(newFile[0].path).pipe(writeStream);
    console.log(4);
    writeStream.on('close', file => {
        console.log(5);
        const {_id} = file;
        return Account.findByIdAndUpdate(uid, {'employer.logo': _id}).then(() => res.redirect('/employer')).catch(e => console.log(e));
    });
},

【问题讨论】:

  • 不确定如何覆盖,但是删除文件然后重新创建它是否非常昂贵?
  • 创建新文件会导致权限被拒绝错误。但如果你能提供一个例子,我很乐意测试一下

标签: javascript node.js file express


【解决方案1】:

您似乎正在将现有文件的路径提供给需要目录的imagemin。要从路径中提取目录,请使用path.dirname(file.path)

const path = require("path");
const newFile = await imagemin([file.path], path.dirname(file.path), {
    ...

请注意,这不会覆盖现有文件。 imagemin 似乎并不直接支持这一点。如果您愿意,您可以使用fs 自己手动完成,但我不确定您为什么会这样做。您似乎有兴趣将这些用作临时文件。在将文件写入 mongo 后,您可能需要添加一些代码来删除文件。

【讨论】:

  • 这导致服务器响应Error: EISDIR: illegal operation on a directory, read 知道如何解决它吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多