Перезапись файлов на Node-сервере - PullRequest
0 голосов
/ 21 ноября 2018

Итак, у меня есть сервер, который временно сохранил файлы в своей памяти, прежде чем загружать их в базу данных.Вот мой код:

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));
    });
},

1 Ответ

0 голосов
/ 21 ноября 2018

Похоже, вы указываете путь к существующему файлу imagemin , где требуется каталог.Чтобы извлечь каталог из пути, используйте path.dirname(file.path):

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

Обратите внимание, что это не будет перезаписывать существующий файл.Похоже, что imagemin не поддерживает это напрямую.Вы можете сделать это вручную, используя fs, если хотите, но я не уверен, почему вы это сделаете.Похоже, вы заинтересованы в их использовании в качестве временных файлов.Возможно, вы захотите добавить некоторый код для удаления файлов после того, как они были записаны в mongo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...