web-dev-qa-db-fra.com

xmlhttprequest pour les fichiers locaux

J'ai le chemin vers un fichier que je veux envoyer à un serveur web de repos le serveur. J'utilise l'objet xmlhttprequest. Le poste est le suivant:

var url = "http://localhost:8080/RestWSGS/jersey/gridsense";
 var boundary = "--------------" + (new Date).getTime();
  xmlHttp.open('POST', url, true);
  xmlHttp.onreadystatechange = function ()
  {
      if (this.readyState != 4)
        return;

      var result =this.responseText;
    document.write(result);
    };
  xmlHttp.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

var  part ="";
 part += 'Content-Disposition: form-data; ';
  part += 'name="' + document.getElementById("filename").name + '" ; ';
  //alert(document.getElementById("filename").value);
  part += 'filename="'+ document.getElementById("filename").value +  '";\r\n';

  part += "Content-Type: application/xml";
  part += "\r\n\r\n"; // marks end of the headers part
  part += 'filename="'+ document.getElementById("filename").value +  '";\r\n';
  part+= data;
   var request = "--" + boundary + "\r\n";
  request+= part /* + "--" + boundary + "\r\n" */;
  request+= "--" + boundary + "--" + "\r\n";
  alert(request); 
  xmlHttp.send(request);  

Les données que je veux envoyer se trouvent sur le disque local du client. Je veux utiliser la méthode get pour cela:

var str = document.getElementById("filename").value;


    var data;
    var xmlhttp1 = getNewHTTPObject();
    xmlhttp1.open("GET", 
    "file:///New Folder/" +document.getElementById("filename").value , false);

    xmlhttp1.send(null);
    alert('hi' + xmlhttp1.status);
    xmlhttp1.onreadystatechange = function()    {
        if (this.status == 0)
        {
            alert("resp " + this.responseText);
            data = this.responseText;
        }
    }

Le fichier: // ne fonctionne pas. Si je mets mon fichier dans le répertoire client et que je supprime le fichier: /// alors je peux au moins voir xmlhttprequest ouvert et donner le statut 200 (je pense ok !!). J'ai lu cela pour le statut de vérification de fichier local == 0 au lieu de readystatus == 4 donc je l'ai fait mais cela donne toujours une variable de données comme indéfinie et donc le fichier ne va pas au serveur. Au début, lorsque j'avais donné l'action au formulaire comme URL de repos, elle se téléchargeait correctement. Comme je n'utilise pas html5, je ne peux pas obtenir l'objet File à partir de l'élément input type = file. Je veux utiliser l'objet xmlhttprequest pour cela au lieu de l'élément de formulaire directement. S'il vous plaît, aidez-moi avec ce problème avec des suggestions ou des conseils KAvita


Même si je fais le téléchargement en utilisant la soumission de formulaire, comment puis-je utiliser la valeur de retour du service Web. C'est la raison pour laquelle j'ai besoin d'utiliser xmlhttpRequest. Si quelqu'un peut suggérer comment la valeur de retour de l'action est utilisée, ce sera génial !! Kavita

25
kavita

Historiquement, vous ne pouvez pas interroger pour les fichiers locaux à partir de JavaScript (ou ne devrait pas y être autorisé, ou quelque chose de bizarre). Ce serait une grave atteinte à la sécurité.

Il n'y a que quelques circonstances dans lesquelles vous pouvez le faire, mais en général, elles impliquent des paramètres de sécurité spécifiques devant être définis pour votre navigateur, soit pour lever la limitation, soit pour informer le processus d'exécution de la page actuelle que ce droit exceptionnel lui est accordé. C'est par exemple faisable dans Firefox en modifiant les propriétés. Il est également généralement OK lors du développement d'extensions de navigateur (par exemple pour Chrome ou FF) si elles demandent les autorisations d'accès aux fichiers.

Une autre façon de contourner cette limitation est d'héberger un serveur Web local et de déclarer des hôtes virtuels sur celui-ci pour pouvoir faire ce genre de demande AJAX pour récupérer les fichiers locaux. C'est assez courant pour que les développeurs web recourent à cette astuce (plus comme un standard, vraiment) pour avoir les avantages du développement local mais en même temps reproduire un système de production. Vous pouvez par exemple utiliser un serveur web léger comme Jetty.

(Une autre gêne moyenne que vous semblez avoir rencontrée est que certains navigateurs - au moins certaines versions FF relativement anciennes, comme 3.6.x - renvoient parfois un code d'erreur positif comme 200 lorsqu'ils les demandes sont bloquées en fonction de leurs politiques de sécurité internes. Cela peut être assez déroutant pendant un certain temps ...).

Enfin, les API HTML5 plus récentes fournissent de nouvelles constructions pour accéder aux fichiers locaux. Considérant la lecture:

D'autres questions SO fournissent également des pointeurs supplémentaires:

22
haylem

J'utilise un iframe.

<div class="item" onclick="page(event)">HTML5</div>

<iframe id="page" src="">
function page(e) {
    trigger = e.currentTarget.innerHTML;
    docname = new String(trigger + ".txt");
    document.getElementById("page").src = docname;
}
4
Ricardo M