30 votes

CORS, Amazon S3 et Rails - échoue sur IE 10 et Safari

IE 10 prend en charge la SCRO. Amazon S3 prend en charge la SCRO.

Nous avons directe-de-site-de-S3 téléchargement de travail dans tous les navigateurs, mais IE 10 (pas la peine avec IE 9-). Il fonctionne comme ceci:

  1. L'utilisateur sélectionne un fichier (glisser-déposer ou chercher à partir d'un fichier d'entrée)

  2. (La POSTE), Nous avons à "signer" la demande avant qu'il aille à S3 ($.post('/static/sign_asset', { ... }) qui a un rappel que les feux parfaitement tout au long de la journée.

  3. (POST) Nous pouvons alors faire le XHR S3 avec le fichier de données et les données à partir de la signature et de la ces.

var xhr = new XMLHttpRequest();
// etc
var fd = new FormData();
// etc
xhr.open('POST', url, true);
xhr.envoyer(fd);

Le téléchargement de fichiers, tout fonctionne parfaitement dans tous les navigateurs, sauf...

Les problèmes de démarrage dans internet explorer 10:

  1. Origine null ne trouve pas dans Access-Control-Allow-Origin-tête. et XMLHttpRequest: Réseau d'Erreur 0x80070005, l'Accès est refusé. Pas d'autres navigateurs sont montrant cette après nous avons mis en response.headers["Access-Control-Allow-Origin"] = "*" dans le contrôleur qui envoie la réponse. Même quand nous avons eu ce mal, Chrome serait montrer cette erreur, mais la demande est encore d'aller à travers.

  2. Le fichier est téléchargé vers S3, en dépit de cette erreur. Amazon S3 est-il de l' 303 rediriger chose - qui est de notre vérification que le fichier a été chargé avec succès.

  3. (GET) C'est une redirection vers un SCRO requête Ajax, donc le "rediriger" ne pas actualiser la page qu'il vient juste de retour et frappe nos serveurs. IE 10 fait cette demande avec une Contenu-Type d' multipart/form-data; boundary=---------------------------7dd2ce2201da

C'est ce que provoque les Rails d'un bug sur.

Started GET "/static/signed/asset/tsabat/83ee6840-7158-0130-c19b-28cfe912f6ff?bucket=s.cdpn.io&key=5%2Fauthor-tim_2.jpg&etag=%2260fb3876d516553ff6f3a018066b3250%22" for 127.0.0.1 at
 2013-03-17 10:46:36 -0700

EOFError - bad content body:
  (gem) rack-1.4.5/lib/rack/multipart/parser.rb:74:in `block in Rack::Multipart::Parser#fast_forward_to_first_boundary'  (gem) rack-1.4.5/lib/rack/multipart/parser.rb:72:in `Rack::Multipart::Parser#fast_forward_to_first_boundary'
  (gem) rack-1.4.5/lib/rack/multipart/parser.rb:72:in `Rack::Multipart::Parser#parse'
  (gem) rack-1.4.5/lib/rack/multipart/parser.rb:15:in `Rack::Multipart.parse_multipart'
  (gem) rack-1.4.5/lib/rack/multipart.rb:25:in `ActionDispatch::Request#parse_multipart'
  (gem) rack-1.4.5/lib/rack/request.rb:336:in `ActionDispatch::Request#POST'
  (gem) rack-1.4.5/lib/rack/request.rb:201:in `ActionDispatch::Request#POST'

Safari ne parvient pas trop (6.0.2)

Safari renvoie un code d'état 200 et Rails de ne pas paniquer à propos de la redirection, mais le xhr.l'état est mauvais. xhr.readyState == 4, mais xhr.status == 0. Nous étions à la recherche pour 200 à faire en sorte que ça fonctionne OK. C'est assez facile à corriger, mais quand même...

Chrome n'beaux - Ne semble pas encore défini le Type de Contenu

Firefox n'beaux - Content-Type application/json; charset=utf-8


Il y a des pages d'exemple qui montrent comment bien IE 10 poignées de la SCRO, mais ils ne traitent pas cette question rediriger.

10voto

timsabat Points 611

CodePen membre de l'équipe ici. Nous avons compris cela...

Nous avons voulu dépendent de la redirection 303 construit en S3 POST fonctionnalité, mais elle s'est avérée problématique, comme indiqué ci-dessus. Au lieu de cela nous avons simplement cessé d'utiliser le Formulaire S3 Champ success_action_redirect et est passé à success_action_status.

Pour la postérité, ne dépendent pas de la S3 303 redirection de travailler de manière cohérente à travers les navigateurs pour les demandes xhr. Si vous le faites, vous allez passer votre temps à lutter contre des invalides en-têtes, null origines, et des dragons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X