45 votes

L'accès est refusé sur IE8

J'ai un formulaire HTML ( upload.htm ) avec un contrôle de téléchargement de fichier HTML à l'intérieur.

<form id="frmupload" name="upload" enctype="multipart/form-data" action="uploadhandler.ashx" method="post">
    <input id="uploader" name="uploadctrl" type="file"/>
</form>

Il existe également une méthode JavaScript dans la page ci-dessus qui se présente comme suit :

function performUpload(){
    document.getElementById('frmupload').submit();
}

J'appelle cela à l'intérieur d'une page ( uploadpage.htm ) à partir d'un iframe :

<iframe id="docframe" src="upload.htm" style="display:none"></iframe>

J'essaie d'exécuter l'instruction ci-dessous à partir de l'interface de l'utilisateur. uploadpage.htm page :

var i = document.getElementById('docframe');
i.contentWindow.performUpload();

Je reçois une erreur disant L'accès est refusé et mon débogueur s'arrête à la première fonction JavaScript que j'ai montrée. Les deux fichiers se trouvent au même endroit dans le projet Web. Ils ont également le même nom de domaine. Pourquoi est-ce que je reçois cette erreur alors ?

Bien sûr, auparavant, je pouvais afficher la page : lorsque je n'avais pas défini le paramètre name pour le contrôle de téléchargement HTML. Mais après avoir défini l'attribut name dans le balisage HTML, j'obtiens cette erreur bizarre. Pourquoi n'ai-je pas eu cette erreur la première fois ?

J'ai regardé ce message --> "Access is denied" lorsque script tente d'accéder à l'iframe dans IE8 mais ça n'a pas aidé.

97voto

Dunc Points 4360

Pour des raisons de sécurité, IE ne permet pas la manipulation de l'élément d'entrée type="file" à partir de javascript. Le fait de définir le nom du fichier ou d'invoquer un événement de clic pour afficher la boîte de dialogue du navigateur entraînera une erreur "Access is denied" lors de l'envoi du formulaire - Internet Explorer est très malin et se souvient des méthodes qui ont été invoquées.

Question similaire : http://www.webdeveloper.com/forum/showthread.php?t=181272

13voto

Rajat Points 4937

Traditionnellement, l'accès JavaScript au HTML input type="file" est sévèrement limité pour des raisons de sécurité. A ma connaissance, vous ne pouvez pas faire ce qui suit avec JS sur un élément de téléchargement de fichiers :

  1. Vous ne pouvez pas lire la "valeur" de l'élément car il contient le nom du fichier.
  2. Vous ne pouvez pas activer le menu de sélection des fichiers via JS.
  3. Vous ne pouvez pas déclencher la soumission du contrôle de l'uploader de fichiers via JS.

Tout cela est en place pour empêcher les attaques malveillantes comme le vol de vos fichiers en arrière-plan via JS. Je n'ai pas joué avec un input type="file" mais je pense que vous rencontrerez des problèmes similaires (si ce n'est tous) dans d'autres navigateurs.

Votre meilleure chance est une solution basée sur Flash ou peut-être un nouveau contrôle HTML5.

Voici également une référence officielle sur le sujet :

http://msdn.microsoft.com/en-us/library/ms535263(v=vs.85).aspx

Cochez la case "Contenu communautaire" tout en bas de la page ci-dessus.

6voto

Samuel Liew Points 17275

J'ai rencontré le même problème - j'utilisais JavaScript pour déclencher un événement de clic sur une entrée de fichier (cachée) - pour éviter aux utilisateurs de cliquer dessus et pour simplifier l'interface utilisateur.

J'ai trouvé une solution de contournement en vérifiant si l'utilisateur utilisait MSIE, et j'ai affiché le champ de téléchargement via une boîte de dialogue jQuery UI pour que l'utilisateur puisse cliquer dessus.

if(jQuery.browser.msie) {
    // let users click on the file field
    $('#hiddenUploadForm').dialog();
}
else {
    // open the filepicker automatically in other browsers
    $('#hiddenUploadForm input[type=file]').click();
}

L'action prévue était que l'utilisateur clique sur l'image, et JavaScript déclenchera un événement de clic sur le bouton (caché) du champ de fichier. La boîte de dialogue du fichier s'ouvrira alors automatiquement pour que l'utilisateur puisse sélectionner un remplacement.

Voici à quoi ressemble la solution de contournement affichée avec le dialogue jQuery UI dans IE9. enter image description here

Informations supplémentaires :

Si vous définissez le niveau de sécurité comme faible dans IE, le message d'erreur n'apparaîtra pas lors de l'envoi du formulaire.

0voto

Gaurav Saxena Points 2029

Dans les deux fichiers HTML - celui qui est dans le cadre et l'autre qui contient le cadre - essayez d'ajouter document.domain='example.com' où "exemple.com" est votre nom de domaine.

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