2016-02-03 2 views
5

Я просто изучаю node.js и с трудом могу сделать простую загрузку файлов с помощью экспресс и multer.Node.js TypeError: Не удается прочитать файл свойств 'undefined

Вот форма:

Загрузить изображение

В моей configure.js у меня есть:

app.use(express.static(path.join(__dirname, 'public'))); 
app.use(multer({dest:'../public/upload/temp'}).single('file')); 

И image.js контроллер:

create: function(req, res) { 
     var saveImage = function() { 
      console.log(req.body); 
      var possible = 'abcdefghijklmnopqrstuvwxyz', 
       imgUrl = ''; 

      for(var i=0; i < 6; i+=1) { 
       imgUrl += possible.charAt(Math.floor(Math.random() * possible.length)); 
      } 

      var tempPath = req.files.file.path, //<line 55 error 
       ext = path.extname(req.files.file.name).toLowerCase(), 
       targetPath = path.resolve('./public/upload/' + imgUrl + ext); 

      if (ext === '.png' || ext === '.jpg' || ext === '.jpeg' || ext === '.gif') { 


       fs.rename(tempPath, targetPath, function(err) { 
        if (err) throw err; 

        res.redirect('/images/' + imgUrl); 
       }); 
      } else { 
       fs.unlink(tempPath, function() { 
        if (err) throw err; 

        res.json(500, {error: 'Only image files are allowed.'}); 
       }); 
      } 
     }; 

     saveImage(); 
    }, 

Однако я получаю эту ошибку, когда я пытаюсь загрузить изображение:

TypeError: Cannot read property 'file' of undefined 
    at saveImage (/home/pc/node-dev/test-proj/controllers/image.js:55:37) 
    at module.exports.create (/home/pc/node-dev/test-proj/controllers/image.js:76:9) 
    at Layer.handle [as handle_request] (/home/pc/node-dev/test-proj/node_modules/express/lib/router/layer.js:95:5) 
    at next (/home/pc/node-dev/test-proj/node_modules/express/lib/router/route.js:131:13) 
    at Route.dispatch (/home/pc/node-dev/test-proj/node_modules/express/lib/router/route.js:112:3) 
    at Layer.handle [as handle_request] (/home/pc/node-dev/test-proj/node_modules/express/lib/router/layer.js:95:5) 
    at /home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:277:22 
    at Function.process_params (/home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:330:12) 
    at next (/home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:271:10) 
    at urlencodedParser (/home/pc/node-dev/test-proj/node_modules/body-parser/lib/types/urlencoded.js:95:37) 

И когда я вхожу в req объект, file не существует:

{ title: 'myimage', description: 'something' } 

На самом деле фрагмент - это лишь слегка измененная версия, которую я читал в this book, которая использует устаревший экспресс-3. Поэтому в основном я только что обновил его с помощью части multer.

Мне интересно, что здесь не так и как это исправить.

+0

Вы когда-нибудь находили подходящее решение для этого с multer? Я попробовал исправление, перечисленное ниже, и сменить его на req.file и req.path, похоже, сработало, но теперь пример из книги перенаправляется на/image/route без успешного наименования или получения файла. – Dave

+0

Вы var tempPath = req.file.path; var ext = путь.extname (req.file.originalname) .toLowerCase(); var targetPath = path.resolve ('./ public/upload /' + imgUrl + ext); – iansari

ответ

9

Вы используете upload.single, который вы должны использовать req.file не req.files. Чтобы загрузить несколько файлов, используйте upload.array.

Обратите внимание, что вам не нужен другой .file после req.file. req.file - это загруженный файл, если вы используете upload.single.

+0

Спасибо за подсказку. Однако теперь, когда я использую 'tempPath = req.file.file.path,' I вызывает 'TypeError: Не удается прочитать свойство« путь »неопределенной ошибки. Есть идеи? – qliq

+1

@qliq [как указано в документе] (https://www.npmjs.com/package/multer#singlefieldname), вам просто нужно использовать 'req.file.path', а не' req.file.file.path' , (Из документа: один файл будет храниться в 'req.file'.) – maowtm

+0

короткий и понятный..thanks приятель – Jana

 Смежные вопросы

  • Нет связанных вопросов^_^