Javascript 使用aws sdk nodejs上传aws s3文件

Javascript 使用aws sdk nodejs上传aws s3文件,javascript,angularjs,node.js,amazon-web-services,amazon-s3,Javascript,Angularjs,Node.js,Amazon Web Services,Amazon S3,我试图从用户{angularjs frontend}将一个文件上传到aws s3 bucket,并将该文件解析为nodejs api路由,但不断收到错误:“TypeError:无法读取未定义的属性'file'。。我可以通过发送带有文件的post请求从postman(chrome扩展名)上传文件,但我不知道如何将文件从angular解析到node js。下面是我正在做的: //节点代码: router.post('/user/upload', multipartMiddleware, functi

我试图从用户{angularjs frontend}将一个文件上传到aws s3 bucket,并将该文件解析为nodejs api路由,但不断收到错误:“TypeError:无法读取未定义的属性'file'。。我可以通过发送带有文件的post请求从postman(chrome扩展名)上传文件,但我不知道如何将文件从angular解析到node js。下面是我正在做的:

//节点代码:

router.post('/user/upload', multipartMiddleware, function(req, res){
        var file = req.files.file;
        var body = fs.createReadStream(file.path);
        var filename =  'post7/media.jpg';

        var s3bucket3 = new AWS.S3();
        s3bucket3.createBucket({Bucket: 'artistarc-user-post-media'}, function() {
          var data = {Bucket: 'artistarc-user-post-media', Key: filename, Body: body};
          s3bucket3.putObject(data, function(err, data) {
            if (err) {
              console.log("Error uploading data: ", err);
            } else {
              console.log("Successfully uploaded data to Bucket");
            }
          });
        });
        res.end('Uploaded');
    });
myApp.controller('galleryController', ['$scope', 'Api', function($scope, Api){

    console.log('galleryController');
    $scope.file = [];
    $scope.uploadFile = function(){
        Api.MediaUpload.save({}, $scope.file, function(){
            console.log('uploaded');
        });
    }
}]);
//ANGULARJS控制器:

router.post('/user/upload', multipartMiddleware, function(req, res){
        var file = req.files.file;
        var body = fs.createReadStream(file.path);
        var filename =  'post7/media.jpg';

        var s3bucket3 = new AWS.S3();
        s3bucket3.createBucket({Bucket: 'artistarc-user-post-media'}, function() {
          var data = {Bucket: 'artistarc-user-post-media', Key: filename, Body: body};
          s3bucket3.putObject(data, function(err, data) {
            if (err) {
              console.log("Error uploading data: ", err);
            } else {
              console.log("Successfully uploaded data to Bucket");
            }
          });
        });
        res.end('Uploaded');
    });
myApp.controller('galleryController', ['$scope', 'Api', function($scope, Api){

    console.log('galleryController');
    $scope.file = [];
    $scope.uploadFile = function(){
        Api.MediaUpload.save({}, $scope.file, function(){
            console.log('uploaded');
        });
    }
}]);
/EJS tempelate

<form>
                <button type="button" class="btn btn-default btn-trans btn-sm" ng-click = "uploadFile()">
                  <span class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></span>
                    Upload
                </button>
                <input type = "file" name = "file"  ng-model="file" file/></div>
</form>

顺便说一句,Aweasome Amazon允许您直接从客户端上传文件,就像从用户浏览器上传一样,而无需通过服务器。通过新的Lambda功能,您可以在上传文件时直接更改存储桶中的文件,例如生成不同大小的新图像等。感谢adeno。。你指的是aws sdk js吗?我试过了,它成功了。但是我很困惑。如果我从客户端而不是服务器端使用上传部分,会安全吗?就像其他任何东西一样安全,而且你的服务器上没有增加流量,文件直接进入AWS。当然,这也意味着如果AWS宕机,它就会失败,但失败的可能性可能很小。好吧,那么客户端就是。愚蠢的问题,但我必须问…galleryController是否已分配给您的表单?因为如果没有,这将解释为什么
$scope.file
没有定义。您可以通过打开web检查器,单击表单元素,并在控制台中键入
angular.element($0.scope()
)来进行测试。检查以确保作用域包含
文件
属性。