Так что у меня возникли проблемы с загрузкой файла непосредственно на 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 затем пытается загрузить непосредственно на s3 с помощью этого подписанного URL ($ scope.uploadDocument())
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 правильно настроен на конце амазонки для этого ведра, потому что я разработал рубиновые приложения, которые используют тот же самый ведро для хранилища разработки. (при условии, что я использовал для этого скрепку и туман). Во-вторых, поскольку у меня нет сбоя сбоя для ответа амазонки, я не подозреваю, что ошибка придет оттуда. Однако это происходит из строки, где я пытаюсь поместить файл на amazon.
Итак, я уверен, что чего-то не хватает, но я думал, что с подписанным URL-адресом мне не нужно ничего больше, чем сделать этот URL-адрес.