2016-09-18 3 views
0

이것은 내 미친 운전. 검색을 시도했지만 제공되는 모든 솔루션이 작동하지 않습니다. multer를 사용하여 간단한 파일 업로드를 만들려고하지만 req.file이 항상 정의되지 않은 것처럼 보이기 때문에 작동하지 않는 것처럼 보입니다.req.file is undefined 멀더

아이디어가 있으십니까? 완전히 엉망이되었습니다 .. 아무것도 작동하지 않고 그냥 정의되지 않은 상태로 되돌아옵니다!

<form method="post" action="/images" enctype="multipart/form-data"> 
<div class="panel-body form-horizontal"> 
    <div class="form-group col-md-12"> 
    <label class="col-sm-2 control-label" for="file">Browse:</label> 
    <div class="col-md-10"> 
     <input class="form-control" type="file" name="file" id="file"> 
    </div> 
    </div> 

    <div class="form-group col-md-12"> 
    <label class="col-md-2 control-label" for="title">Title:</label> 
    <div class="col-md-10"> 
     <input class="form-control" type="text" name="title"> 
    </div> 
    </div> 

    <div class="form-group col-md-12"> 
     <label class="col-md-2 control-label" for="description">Description:</label> 
     <div class="col-md-10"> 
     <textarea class="form-control" name="description" rows="2"></textarea> 
     </div> 
    </div> 

    <div class="form-group col-md-12"> 
     <div class="col-md-12 text-right"> 
      <button type="submit" id="login-btn" class="btn btn-success" type="button"> 
      <i class="fa fa-cloud-upload "></i> Upload Image</button> 
     </div> 
    </div> 
    </div> 
</form> 

경로 :

var express = require('express'), 
path = require('path'), 
router = express.Router(), 
home = require('../controllers/home'), 
image = require('../controllers/image'), 
multer = require('multer'); 

var upload = multer({ dest: path.join(__dirname, 'public/upload/temp')}); 


module.exports = function(app) { 
    router.get('/', home.index); 
    router.get('/images/:image_id', image.index); 
    router.post('/images', upload.single('file'), image.create); 
    router.post('/images/:image_id/like', image.like); 
    router.post('/images/:image_id/comment', image.comment); 
    app.use(router); 
}; 

컨트롤러 :

create: function(req, res) {   
console.log(req.file); 
    } 
,691

여기

var path = require('path'), 
routes = require('./routes'), 
exphbs = require('express-handlebars'), 
express = require('express'), 
bodyParser = require('body-parser'), 
cookieParser = require('cookie-parser'), 
morgan = require('morgan'), 
methodOverride = require('method-override'), 
errorHandler = require('errorhandler'); 
moment = require('moment'); 


module.exports = function(app) { 

    app.use(morgan('dev')); 
    app.use(bodyParser.urlencoded({'extended':true})); 
    app.use(bodyParser.json()); 
    //app.use(multer({ dest: path.join(__dirname, 'public/upload/temp')})); 
    app.use(methodOverride()); 
    app.use(cookieParser('some-secret-value-here')); 
    routes(app);//moving the routes to routes folder. 

    app.use('/public/', express.static(path.join(__dirname,'../public'))); 
    if ('development' === app.get('env')) { 
    app.use(errorHandler()); 
    } 

    app.engine('handlebars', exphbs.create({ 
     defaultLayout: 'main', 
     layoutsDir: app.get('views') + '/layouts', 
     partialsDir: [app.get('views') + '/partials'], 
     helpers: { 
       timeago: function(timestamp) { 
          return  moment(timestamp).startOf('minute').fromNow(); 
       } 
       } 
    }).engine); 
    app.set('view engine', 'handlebars'); 
     return app; 
}; 

내 HTML입니다 app.js 나는 약간의 진전을했다고 생각 몸 {}

: 그냥 다른 노트

이 ... Req.body가 완전히 비어 ... 나는 그것을 참조하십시오. 파일과 본문에 대한 내용이 표시되지만 아직 정의되지 않았다고 말하고 있습니까? 몸 : {제목 : 'fdsfdsa'설명 : 'fdsafdsa'}, originalMethod : 'POST', 비밀 '어떤 비밀 값 - 여기', 쿠키 : {}, signedCookies : {}, 경로 : 경로 { 경로 : '/ 이미지', 스택 : [[오브젝트], [] 객체, 방법 : {게시물 : 사실}} 읽기 : [기능], 파일 : {필드 이름 : 'file', originalname : 'Chrysanthemum2.jpg', 인코딩 : '7bit', mimetype : 'image/jpeg', 대상 : 'C : \ testapp \ server \ public \ upload \ temp', 파일 이름 : 'fd17765e4cd03268db6757b8cfb21649', 경로 : 'C : \ 공공 \ 업로드 \ 임시 \의 fd17765e4cd03268db6757b8c b21649 \ testapp를의 \ 서버', 크기 : 15973}} ypeError : 정의되지 않은

답변

1

의 속성을 읽을 수 없습니다 '파일' upload.single() (코드에 표시됨)을 사용하는 경우 결과는 req.files이 아닌 req.file이됩니다. 그래서이를 변경 :

create: function(req, res) {   
    console.log(req.files); 
} 

을 여기에 :

create: function(req, res) {   
    console.log(req.file); 
} 

을 또한, 당신이 사용할 것으로 예상하고이 경로의 경우 : 다음

router.post('/images', image.create); 

, 당신은 돈 ' 해당 경로에 대해 upload() 미들웨어가 설치되어 있어야합니다.

+0

두 가지 모두 시도했습니다 ... 둘 다 정의되지 않았습니다. 누군가? – user1655940

+0

@ user1655940 -'image.create()'를 호출하는 경로에 대해 미들웨어를 설치하지 않았다는 것에 대한 내 대답에 무엇을 추가했는지보십시오. – jfriend00

+0

어리석은 실수. 방금 업데이트하고 테스트했습니다. 아직 정의되지 않았습니다. – user1655940