【发布时间】:2013-10-19 19:16:03
【问题描述】:
所以我在将文件直接上传到 S3 时遇到了一些问题。目前我的流程是向 nodejs/express 发出请求以获取签名 URL。
app.post('/s3SignedURL', function(req, res){
var id = crypto.randomBytes(20).toString('hex');
var ext = path.extname(req.body.fileName);
var unambFilename = path.basename(req.body.fileName, ext) + '-' + id + ext;
var params = {Bucket: awsBucket, Key: unambFilename, Expires: 30};
var signedUrl = s3.getSignedUrl('putObject', params);
res.send({signedUrl: signedUrl, s3FileName: unambFilename});
});
然后我的 Angular 控制器尝试使用该签名 URL ($scope.uploadDocument()) 直接上传到 s3
flqApp.controller('DocUploadModalCtrl', ['$scope', '$http', 'customProvider', 'custom',
function($scope, $http, customProvider, custom){
$scope.fileTypes =
[
"Type 1",
"Type 2"
]
$scope.setFile = function(element){
$scope.$apply(function($scope){
$scope.currentDocument = element.files[0];
});
}
$scope.uploadDocument = function() {
$http.post('/s3SignedURL', {fileName: $scope.currentDocument.name} )
.success(function(results){
$http.put(results.signedUrl, $scope.currentDocument)
.success(function(){
custom.document = s3FileName;
customProvider.save(custom, function(){
//..do something here
});
});
});
};
}]);
我的 html 表单看起来像
<form ng-submit="uploadDocument()">
<label for="documentType">File Type</label>
<select class="form-control" ng-model="docType" ng-options="type for type in fileTypes" required >
<option value=""/>
</select>
<label for="filename">Choose file to upload</label>
<input type="file"
name="s3File"
onchange="angular.element(this).scope().setFile(this)"
ng-model="fileName"
required />
<input type="submit" value="Upload File">
</form>
但是,每当我尝试上传到 S3 时,我都会收到错误
Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin
我知道在亚马逊端为该存储桶正确设置了 S3 CORS,因为我开发了使用相同存储桶进行开发存储的 ruby 应用程序。 (当然我用回形针和雾来做这些)。其次,由于我没有亚马逊响应的失败捕获,我不怀疑错误来自那里。但是,它确实来自我尝试将文件放在亚马逊上的那一行。
所以我确定我遗漏了一些东西,但我认为使用签名 URL 时,我只需要对那个 URL 进行放置即可。
【问题讨论】:
-
只是好奇......你有没有在 Angular 中得到这个工作?我正准备做类似的事情。
-
从来没有让它工作。最终上传到我的 node.js 服务器并使用亚马逊的 node 包上传。
-
@nbppp2 您是否尝试过使用 ng-s3upload 和 rails 应用程序进行文件上传?
-
所以我正在开发的应用程序是在 Node 中而不是在 Rails 中,但是在 nodejs 中下面的 rails 示例代码有等价物。可悲的是,在给出答案时,我们已经以不同的方式实现了它。由于它为我们提供了其他好处,我们决定保持这种不同的方式。我确实回去尝试了这个模块,并且能够让它在 Angular 和 nodejs 中工作。但是我回去看看我是否能找到我的代码,但似乎我删除了它。可能在我认为我不会再去的本地分支上。