MEAN Stack File uploads

后端 未结 4 1529
生来不讨喜
生来不讨喜 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:37

    I recently did something just like this. I used angular-file-upload. You'll also want node-multiparty for your endpoint to parse the form data. Then you could use s3 for uploading the file to s3.

    Here's some of my [edited] code.

    Angular Template

    
    

    Angular Controller

    $scope.onFileSelect = function(image) {
      $scope.uploadInProgress = true;
      $scope.uploadProgress = 0;
    
      if (angular.isArray(image)) {
        image = image[0];
      }
    
      $scope.upload = $upload.upload({
        url: '/api/v1/upload/image',
        method: 'POST',
        data: {
          type: 'profile'
        },
        file: image
      }).progress(function(event) {
        $scope.uploadProgress = Math.floor(event.loaded / event.total);
        $scope.$apply();
      }).success(function(data, status, headers, config) {
        AlertService.success('Photo uploaded!');
      }).error(function(err) {
        $scope.uploadInProgress = false;
        AlertService.error('Error uploading file: ' + err.message || err);
      });
    };
    

    Route

    var uuid = require('uuid'); // https://github.com/defunctzombie/node-uuid
    var multiparty = require('multiparty'); // https://github.com/andrewrk/node-multiparty
    var s3 = require('s3'); // https://github.com/andrewrk/node-s3-client
    
    var s3Client = s3.createClient({
      key: '',
      secret: '',
      bucket: ''
    });
    
    module.exports = function(app) {
      app.post('/api/v1/upload/image', function(req, res) {
        var form = new multiparty.Form();
        form.parse(req, function(err, fields, files) {
          var file = files.file[0];
          var contentType = file.headers['content-type'];
          var extension = file.path.substring(file.path.lastIndexOf('.'));
          var destPath = '/' + user.id + '/profile' + '/' + uuid.v4() + extension;
    
          var headers = {
            'x-amz-acl': 'public-read',
            'Content-Length': file.size,
            'Content-Type': contentType
          };
          var uploader = s3Client.upload(file.path, destPath, headers);
    
          uploader.on('error', function(err) {
            //TODO handle this
          });
    
          uploader.on('end', function(url) {
            //TODO do something with the url
            console.log('file opened:', url);
          });
        });
      });
    }
    

    I changed this from my code, so it may not work out of the box, but hopefully it's helpful!

提交回复
热议问题