J'essaie de télécharger mon fichier via:
console.log("not broken til here");
scope.inputMemeIsFile=true;
var bucket = new AWS.S3({params: {Bucket: 'townhall.images'}});
file = image.file;
console.log(file);
var params = {Key: file.name, ContentType: file.type, Body: file};
bucket.upload(params, function (err, data) {
var result = err ? 'ERROR!' : 'UPLOADED.';
console.log(result);
console.log(err);
});
Cependant, j'obtiens l'erreur suivante:
XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKETNAME>/favicon.jpg. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access.
avec la procédureError: Network Failure {message: "Network Failure", code: "NetworkingError", time: Tue Feb 17 2015 13:37:06 GMT-0500 (EST), region: "us-east-1", hostname: "s3.amazonaws.com"…
}
Ma configuration CORS ressemble à ceci et j'ai essayé quelques trucs sans succès.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Quelqu'un a une idée de ce qui ne va pas? J'ai consulté 5-6 messages similaires, mais personne ne semble pouvoir résoudre le problème.
Afin de télécharger des fichiers via un navigateur, vous devez vous assurer que vous avez configuré CORS pour votre compartiment Amazon S3 et exposé l'en-tête "ETag" via la déclaration ETag.
Je vous suggère de commencer avec une configuration de test ouverte, puis de la modifier selon vos besoins:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
</CORSRule>
</CORSConfiguration>
Vérifiez ensuite vos autorisations de compartiment et votre configuration AWS
(accessKeyId
, secretAccessKey
et region
) car aucune de celles-ci n'est présente dans votre extrait de code.
Pour les tests, accédez à votre console de gestion IAM et créez un nouvel utilisateur IAM nommé prefix-townhall-test
puis créez un groupe avec cette stratégie simple qui accorde l'accès à un compartiment:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test-bucket-name"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test-bucket-name/*"]
}
]
}
Assurez-vous que l'utilisateur que vous avez créé utilise le nouveau groupe avec cette stratégie.
Créez maintenant un script de test simple comme celui utilisé sur Amazon:
HTML
<input id="file-chooser" type="file" />
<button id="upload-button">Upload</button>
<p id="results"></p>
CODE (sur DOM prêt)
// update credentials
var credentials = {accessKeyId: 'new accessKeyId', secretAccessKey: 'new secretAccessKey'};
AWS.config.update(credentials);
AWS.config.region = 'us-west-1';
// create bucket instance
var bucket = new AWS.S3({params: {Bucket: 'test-bucket-name'}});
var fileChooser = document.getElementById('file-chooser');
var button = document.getElementById('upload-button');
var results = document.getElementById('results');
button.addEventListener('click', function() {
var file = fileChooser.files[0];
if (file) {
results.innerHTML = '';
var params = {Key: file.name, ContentType: file.type, Body: file};
bucket.upload(params, function (err, data) {
results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
});
} else {
results.innerHTML = 'Nothing to upload.';
}
}, false);
Certains navigateurs, tels que Chrome, ne prennent pas en charge localhost
ou 127.0.0.1
pour les demandes CORS.
Essayez d'utiliser à la place: http://lvh.me:5000/
Voir https://stackoverflow.com/a/10892392/1464716 pour en savoir plus.
Essayez <AllowedOrigin>*</AllowedOrigin>
, sans protocole.
Si cela n'a aucun effet - vous avez probablement un problème côté client.
Avez-vous essayé de spécifier votre origine au lieu d'utiliser un caractère générique. Je suis presque sûr que nous avons eu des problèmes similaires par le passé.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://127.0.0.1:5000</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>