Генерация пути назначения перед загрузкой файла - multer - PullRequest
0 голосов
/ 24 декабря 2018

Попытка создать папку перед загрузкой в ​​нее файла.Однако существует проблема, если я не обновляю сервер на узле, когда я пытаюсь загрузить файл снова, он добавляется в уже созданную папку.Если я обновляю сервер, он создает новую папку и загружает ее по мере необходимости.Пожалуйста, посмотрите код, как я могу улучшить его?

const db = require('../db');
const fs = require('fs');
const path = require('path');
const uuidv1 = require('uuid/v1');
const multer = require('multer');

console.log(uuidv1())
let storage = multer.diskStorage({
  destination: `./uploads/${uuidv1()}`,
  filename: (req, file, cb) => {
    cb(null, 'test1' + '-' + Date.now() + '.' + path.extname(file.originalname));
  }
});

let upload = multer({storage});

module.exports = (router) => {

  router.get('/get', (req, res) => {
    db.connect.query('SELECT * FROM habalka',
      {type: db.sequelize.QueryTypes.SELECT}
    ).then(result => {
      res.json(result);
    })
  });

  router.post('/post', upload.any(), (req, res) => {
    res.json('test');


  });

  return router;
};

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Мой окончательный код здесь, и он работает! Спасибо

const db = require('../db');
const fs = require('fs');
const uuidv1 = require('uuid/v1');
const path = require('path');
const multer = require('multer');
const shell = require('shelljs');


console.log(uuidv1())

let storage = multer.diskStorage({

  // pass function that will generate destination path
  destination: (req, file, cb) => {
    // initial upload path
    let destination = path.join(__dirname, '../uploads'); // ./uploads/

    let id = uuidv1();
    shell.mkdir('-p', './uploads/' + id);
    destination = path.join(destination, '', id); // ./uploads/files/generated-uuid-here/
    console.log('dest', destination)

    cb(
      null,
      destination
    );
  },

  // pass function that may generate unique filename if needed
  filename: (req, file, cb) => {
    cb(
      null,
      Date.now() + '.' + path.extname(file.originalname)
    );
  }

});

var upload = multer({storage: storage})

module.exports = (router) => {

  router.get('/get', (req, res) => {
    db.connect.query('SELECT * FROM habalka',
      {type: db.sequelize.QueryTypes.SELECT}
    ).then(result => {
      res.json(result);
    })
  });

  router.post('/post', upload.any(), (req, res) => {
    res.json('test');


  });

  return router;
};
0 голосов
/ 24 декабря 2018

Ваша проблема в том, что при запуске приложения оно генерирует новый uuid (один раз - при запуске приложения) и передается в виде строки методу diskStorage.

Но вы хотите генерировать этот путь каждый раз, когда загружаете файл.

Итак, вот решение:

Multer имеет функцию для динамического генерации оба путь назначения и имя файла .

Итак, вам нужно передать функцию , которая будет генерировать путь и вернуть его в обратный вызов .

Пример после прочтения этого руководства :

let storage = multer.diskStorage({

  // pass function that will generate destination path
  destination: (req, file, cb) => {

    // initial upload path
    let destination = path.join(__dirname, 'uploads'); // ./uploads/

    // if user logged in and You store user object in session
    if (req.session && req.session.user && req.session.user.id) {
      destination = path.join(destination, 'users', req.session.user.id, uuidv1()); // ./uploads/users/8/generated-uuid-here/
    }
    else {
      destination = path.join(destination, 'files', uuidv1()); // ./uploads/files/generated-uuid-here/
    }

    cb(
      null, 
      destination
    );
  },

  // pass function that may generate unique filename if needed
  filename: (req, file, cb) => {
    cb(
      null, 
      Date.now() + '.' + path.extname(file.originalname)
    );
  }

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