MEAN Stack File uploads

后端 未结 4 1609
生来不讨喜
生来不讨喜 2021-01-30 15:08

I\'ve recently started programming with the MEAN Stack, and I\'m currently implementing some sort of social network. Been using the MEAN.io framework to do so. My main problem r

4条回答
  •  你的背包
    2021-01-30 15:31

    I know this post is old. I came across it and @kentcdodds had an answer that i really liked, but the libraries he used are now out of date and I could not get them to work. So after some research i have a newer similar solution I want to share.

    HTML using ng-upload

    INCLUDE ng-upload module

    download it, references the files and include the module

    var app = angular.module('app', ['ngFileUpload']);
    

    this will give you access to the Upload service.

    Controller code

    $scope.uploadFiles = function(file, errFiles) {
        $scope.f = file;
        $scope.errFile = errFiles && errFiles[0];
        if (file) {
            file.upload = Upload.upload({
                url: 'you-api-endpoint',
                data: {file: file}
            });
    
            //put promise and event watchers here if wanted
        }   
    };
    

    NODE api code

    All the code below is in a separate route file which is required in my main server.js file.

    require('./app/app-routes.js')(app, _);

    var fs = require('fs');
    var uuid = require('uuid');
    var s3 = require('s3fs'); // https://github.com/RiptideElements/s3fs
    var s3Impl = new s3('bucketname', {
        accessKeyId: '',
        secretAccessKey: '< your secret access key >'
    });
    
    var multiparty = require('connect-multiparty');
    var multipartyMiddleware = multiparty();
    
    module.exports = function(app, _) {
        app.use(multipartyMiddleware);
    
    
        app.post('/your-api-endpoint',function(req, res){
    
        var file = req.files.file; // multiparty is what allows the file to to be accessed in the req
        var stream = fs.createReadStream(file.path);
        var extension = file.path.substring(file.path.lastIndexOf('.'));
        var destPath = '/' + req.user._id + '/avatar/' +  uuid.v4() + extension;
        var base = 'https://you-bucket-url';
        return s3Impl.writeFile(destPath, stream, {ContentType: file.type}).then(function(one){
            fs.unlink(file.path);
            res.send(base + destPath); 
        });
    });
    

    All i was trying to do was upload a unique avatar for a user. Hope this helps!!

提交回复
热议问题