将文件发送到后端角度满堆栈

时间:2018-04-01 22:21:55

标签: javascript node.js angular amazon-s3

我正在使用yeoman angular fullstack,我试图做一个简单的文件上传。我从一个表单中读取文件,然后将它放到前端就好了

this.$scope.add = function() {

    var f = document.getElementById('resume').files[0];
    var reader = new FileReader();

    reader.onload = (function(theFile) {
      return function(e) {
      console.log(e.target.result);
        Auth.saveResume({
          data: e.target.result,
          name:theFile.name
        });
      };
    })(f);

    reader.readAsArrayBuffer(f);      
  }

在auth.services.ts中我有

saveResume(resume, callback?: Function) {
  console.log(User)
  return User.saveResume({ id: currentUser._id }, {resume},
    function() {
      console.log('auth.service in function');
      console.log('currentUser._id: ' + currentUser._id);
      return safeCb(callback)(null);
    },
    function(err) {
      return safeCb(callback)(err);
    }).$promise;
},

它成功进入我的后端控制器

router.put('/:id/resume', auth.isAuthenticated(), controller.saveResume);

我有一个saveResume函数

export function saveResume(req, res){

    console.log(typeof req.body.resume.data);
    console.log(typeof req.body.resume.name);

}

在保存恢复功能中,当我访问" name"参数是正确的,是字符串类型。但是,当我访问"数据"我只是得到一个对象。我希望数据可以是文件或缓冲区,因此我可以将其上传到s3。

我唯一猜测为什么它的对象而不是ArrayBuffer是我认为节点不支持javascript ArrayBuffers,blob或文件。如何以s3接受的某种形式获取后端文件?即文件,blob或缓冲区

1 个答案:

答案 0 :(得分:0)

正如@bubblez建议我将它编码为基础64,如此

    var fileReader = new FileReader();
    var base64;
     // Onload of file read the file content
     fileReader.onload = function(fileLoadedEvent) {
        base64 = fileLoadedEvent.target.result;
        // Print data in console
        console.log(base64);
        Auth.saveResume(f.name, base64);
      };
    // Convert data to base64
    fileReader.readAsDataURL(f);

我也改变了auth,因此它需要两个独立的参数

saveResume(name, data, callback?: Function) {
  console.log(User)
  return User.saveResume({ id: currentUser._id }, {name, data},
    function() {
      console.log('auth.service in function');
      console.log('currentUser._id: ' + currentUser._id);
      return safeCb(callback)(null);
    },
    function(err) {
      return safeCb(callback)(err);
    }).$promise;
},
然后我从base 64解码

export function saveResume(req, res){
    var base64String = req.body.data.split(';base64,').pop();
    console.log(base64String);
    var buf = Buffer.from(base64String, 'base64').toString('utf');
    uploadParams.Body = buf;
}

这有效!