m0sk1t
@m0sk1t
SPA web-developer

NodeJS+ImageMagick+Multipart form data, из-за чего может быть проблема?

В чём суть: пишу метод для загрузки нескольких изображений, попутно переименовывая их взяв за новое имя хэш полученный от изображения. Но поскольку мало опыта работы с файловой системой из NodeJS, столкнулся с трудностями... Вот мой код:
app.post('/upload', function(req, res){
    var photos = [];

    for (var l = req.files.files.length; l--; ) {
        (function(l){
            im.resize({
                srcData: fs.readFileSync(req.files.files[l].path, 'binary'),
                width: 300,
                height: 400,
                format: 'jpg',
            }, function(err, stdout, stderr){
                if (err) {
                    return console.error(err);
                } else {
                    fs.writeFileSync(req.files.files[l].path, stdout, 'binary');
                    var hash = crypto.createHash('md5'),
                        rdd = fs.createReadStream(req.files.files[l].path);
                    rdd.on('end', function () {
                        var newfilename = '';
                        hash.end();
                        newfilename = hash.read() + '.jpg';
                        console.log(newfilename);
                        photos.push(newfilename);
                        fs.rename(req.files.files[l].path,
                                  __dirname + '/pub/img/' + newfilename);
                        rdd.close();
                        fs.unlinkSync(req.files.files[l].path);
                        !l && res.redirect('/#!/item/'+req.body.id);
                    });
                    rdd.pipe(hash);
                }
            });
        })(l);
    }
});

Вроде использую Sync методы а получаю ошибку

Error: ENOENT, open '/home/m0sk1t/projects/sorm/tmp/pHNhXY2MQ-Ib_WeWp7A06A0V.jpg'
at Error (native)


Working remake!

Переписал по совету Илья Шатохин. Заработало =)
app.post('/upload', function(req, res){
    var photos = [];
    console.log(req.body.id);

    for (var l = req.files.files.length; l--; ) {
        (function(l){
            im.resize({
                srcData: fs.readFileSync(req.files.files[l].path, 'binary'),
                width: 300,
                height: 400,
                format: 'jpg',
            }, function(err, stdout, stderr){
                fs.writeFile(req.files.files[l].path, stdout, 'binary', function(err){
                    if (err) return console.error(err);
                    var hash = crypto.createHash('sha1'),
                        rdd = fs.createReadStream(req.files.files[l].path);
                    rdd.on('end', function () {
                        var newfilename = '';
                        rdd.close();
                        newfilename = hash.digest('hex') + '.jpg';
                        console.log(newfilename);
                        photos.push(newfilename);
                        fs.rename(req.files.files[l].path,
                                  __dirname + '/pub/img/' + newfilename, function(){
                            !l && res.redirect('/#!/item/'+req.body.id);
                        });
                    });
                    rdd.on('data', function(d) {
                        hash.update(d);
                    });
                });
            });
        })(l);
    }
});

  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
@iShatokhin
JS developer
Как минимум fs.rename у вас асинхронная и вы тут же делаете удаление файла синхронно, логично, что rename будет нечего перемещать.

P.S. использовать синхронные функции - моветон (плюс падение производительности). Лучше перепишите на асинхронные с контролем выполнения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kos403
Оптимист, спортсмен
И код говно...почитайте чистый код и перепишите нормально
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы