Сохранение имени изображения с помощью multer не работает при первой загрузке - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь загрузить изображение, используя multer, в свою базу данных. Когда я пытаюсь загрузить, используя ng-submit, мое изображение было сохранено в моей папке, и путь к базе данных не был сохранен, но после второй попытки: оно сохраняет изображение в папку, но имя изображения было именем с моей 1-й попытки, затем с 3-го раза я повторяю попытку: изображение было загружено в папку, затем имя изображения было именем с 2-й попытки, например:

1st try: image uploaded: apple.jpg result in mongodb: none

2nd try: image uploaded: cicada.jpg result in mongodb: img{1547033391393_apple.jpg}

3rd try image uploaded: logo.jpg result in mongodb: img{1547033119631_cicada.jpg}

Вот мой код, какую часть я делаю не так?

схема

var NewsfeedSchema = new Schema({
    subject: { type: String, required: false},
    nw_content: { type: String, required: false, lowercase: false},
    img: {type: String,required: false}
});

newsfeed.html

<form ng-submit="newsfeed.regNewsfeed(regData); Submit()">
    <input type="text" name="subject" ng-model="newsfeed.regData.subject">
    <textarea type="text" name="nw_content"  ng-model="newsfeed.regData.nw_content"></textarea>                    
    <label>
        Browse
        <input type = "file" file-model="file.upload"  name="myfile" ng-disbled="uploading">
    </label>
    <img style = "width:100px">                  
    <button ng-disabled="uploading" type="submit">Send Announcement</button>           
</form>

newsfeedCtrl.js

.controller('newsfeedCtrl', function($http, $location, Newsfeed, $route,uploadFile) {
    var app = this;
    app.file = {};

    app.Submit = function(){
        $scope.uploading = true;
        uploadFile.upload(app.file).then(function(data){
            if(data.data.success){
                $scope.alert = 'alert alert-success';
                $scope.file = {};
            } else { 
                $scope.alert = 'alert alert-danger';
                $scope.file = {};
            }
        })
    }

    app.regNewsfeed = function(regData) {
        Newsfeed.create(app.regData).then(function(data) {
            app.successMsg = data.data.message + '...Redirecting';
        });
    };
});

newsfeedServices.js

.factory('Newsfeed', function($http) {
    var newsfeedFactory = {}; 

    newsfeedFactory.create = function(regData) {
        return $http.post('/api/upload', regData); 
    };

    newsfeedFactory.upload = function(file){
        var fd = new FormData();
        fd.append('myfile', file.upload);
        return $http.post('/api/upload',fd,{
            transformRequest:angular.identity,
            headers:{'Content-Type':undefined}
        });
    };
    return newsfeedFactory;
});

api.js

var multer    = require ('multer');
var Newsfeed  = require('../models/newsfeed');
var imageName;

var storage = multer.diskStorage({
    destination:function(req,file,cb){
        cb(null,'./public/assets/images');
    },
    filename:function(req,file,cb){
        if(!file.originalname.match(/\.(png|jpg|jpeg)$/)){
            var err = new Error();
            err.code = 'filetype';
            return cb(err);
        }else{
            imageName =  Date.now() + '_' + file.originalname;
            cb(null, imageName);
        }   
    }
})

var upload = multer({
    storage:storage,
    limits:{fileSize:10000000}
}).single('myfile');
const parser = multer({ storage: storage });

router.post('/upload', parser.single("myfile"),function(req,res){
    upload(req,res,function(err){
        const image = {};
        if(err){
            console.log(err);
        } else {     
            res.json({success:false,message:'File uploaded!'});     
        }
    })
    var newsfeed = new Newsfeed(); 
    newsfeed.subject = req.body.subject;   
    newsfeed.nw_content = req.body.nw_content;
    myImage = imageName.toString('base64');
    newsfeed.img = myImage;   
    newsfeed.save(function(err) {});
})
...