UPDATE : A partir de Webkit build r230963 Ce problème a été résolu dans Webkit.
\===========
Depuis la récente mise à jour de Safari 11.1 sur macOS et iOS, ainsi que dans l'aperçu technologique Safari 11.2, l'option $.ajax
dans mon application web échouent lorsqu'un input[type=file]
n'a pas de fichier choisi (il n'est pas requis dans mon formulaire). Pas d'échec lorsque le champ fait ont choisi un dossier.
El error
rappel de ajax
s'exécute et la console Safari contient le message suivant : Failed to load resource: The operation couldn’t be completed. Protocol error
. Je suis en HTTPS et je soumets à un emplacement sur le même domaine (et serveur) également en HTTPS.
Avant la mise à jour 11.1, le $.ajax
L'appel a été soumis sans problème lorsqu'aucun fichier n'a été choisi. Les dernières versions de Chrome et de Firefox ne posent aucun problème.
Parties pertinentes de mon code :
L'entrée :
Browse... <input id="file-upload" type="file" name="image" accept=".jpg,.jpeg">
La JS :
var formData = new FormData($(this)[0]);
$.ajax({
type: 'POST',
enctype: 'multipart/form-data',
url: '../process.php',
data: formData,
contentType: false,
processData: false,
cache: false,
success: function(response) { ... },
error: function() { //my code reaches here }
});
Comme solution temporaire (en espérant qu'elle le soit), je détecte un champ de fichier vide et le supprime de formData
avant le ajax
appel et tout fonctionne comme prévu/avant :
$("input[type=file]").each(function() {
if($(this).val() === "") {
formData.delete($(this).attr("name"));
}
});
Est-ce que je fais quelque chose de mal, est-ce qu'il y a un problème avec Safari, ou y a-t-il un changement dans Safari qui doit être pris en compte dans les appels ajax ?
1 votes
Excellente solution temporaire, mais ne fonctionne pas sous Safari 11 si elle est appliquée à tous les navigateurs Safari. Avez-vous trouvé une "vraie" solution ?
0 votes
@Karem - Merci pour cette info ! Heureusement, les utilisateurs de mon application ne seront pas sous Safari 11 mais c'est bon à savoir. Et non, pas encore de solution. J'ai déposé un rapport de radar/bug auprès d'Apple et ils viennent de demander aujourd'hui un diagnostic du système que je vais envoyer.
0 votes
J'ai eu le même problème et cet article m'a beaucoup aidé. Merci. Pour information, je crois que FormDeta#delete() n'est supporté que dans Safari 11 ou plus. Vous devez donc ajouter un contrôle de version. caniuse.com/#feat=xhr2 Quoi qu'il en soit, merci pour vos informations.
0 votes
Oui, delete() est peut-être la solution. Des suggestions sur la façon d'ajouter un contrôle de version avec javascript ?
0 votes
@Matt. Merci. Avez-vous un lien vers le rapport Apple que vous avez déposé ?
0 votes
@Laurent.B Je ne sais pas puisqu'il a été déposé via Bug Reporter sur le site des développeurs d'Apple. (A moins qu'il n'y ait un moyen de les partager)
0 votes
@Matt Je ne sais pas, je ne suis pas un utilisateur d'Apple. Je vous suggère (si ce n'est déjà fait) de leur envoyer le lien vers cette Q/A. Il y en a quelques autres concernant le même problème avec Safari (ce n'est pas si nouveau que je le pensais au début)... Ils ne sont peut-être pas au courant :/
0 votes
@Laurent.B Dans mon rapport de bogue, j'ai initialement fourni un lien vers cette page StackOverflow. J'espère donc que cela les aidera.
0 votes
@Matt parfait. Thx
1 votes
Il y a un item bugzilla ouvert pour WebKit, et aussi un rdar il semble. bugs.webkit.org/show_bug.cgi?id=184490
0 votes
Une correction a été apportée à Webkit trac.webkit.org/changeset/230963/webkit . J'attendrai la prochaine version pour la tester.
0 votes
Oui, le problème a été résolu, je peux le confirmer. Aucune idée de quand il sera dans la version publique.
0 votes
C'est toujours un problème pour moi dans iOS 11.4. Et la solution fournie ne fonctionne pas
0 votes
@ErickMaynard La correction n'a pas été intégrée à la version de Safari dans iOS 11.4. Je doute également qu'il soit intégré à la version publique de macOS 10.13.5. La solution fournie fonctionne. Les gens peuvent vous aider si vous partagez ce que vous avez essayé et/ou ce que vous avez :)
0 votes
La correction du bogue est incluse dans Safari qui est inclus dans la version bêta 1 d'iOS 12. Je suppose qu'il en va de même pour macOS Mojave beta 1.
0 votes
Une idée de la date à laquelle il sera intégré à Safari pour les utilisateurs quotidiens ?
0 votes
@drooh Pas avant Safari 12, qui sortira en même temps qu'iOS 12 et macOS Mojave, probablement à la mi-septembre.