2017-08-28 1 views
9

Création d'une extension Web et portage depuis XUL. J'avais l'habitude de pouvoir lire facilement des fichiers avecExtension Web Firefox - lecture du fichier local (dernier fichier téléchargé)

var dJsm = Components.utils.import("resource://gre/modules/Downloads.jsm").Downloads; 
    var tJsm = Components.utils.import("resource://gre/modules/Task.jsm").Task; 
    var fuJsm = Components.utils.import("resource://gre/modules/FileUtils.jsm").FileUtils; 
    var nsiPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService); 

    .... 

    NetUtil.asyncFetch(file, function(inputStream, status) { 
      if (!Components.isSuccessCode(status)) { 
      return; 
      } 
      var data = NetUtil.readInputStreamToString(inputStream, inputStream.available()); 
      var data = window.btoa(data); 
      var encoded_data_to_send_via_xmlhttp = encodeURIComponent(data); 
      ... 
    }); 

Ce qui précède sera obsolète.

je peux utiliser le downloads.download() pour savoir ce qui était le dernier téléchargement, mais je ne peux pas lire le fichier, puis obtenir l'équivalent pour encoded_data_to_send_via_xmlhttp

également dans Firefox 57 partir, signifie que je dois essayer pour simuler une action de l'utilisateur par un clic de bouton ou quelque chose, ou télécharger un fichier.

Access to file:// URLs or reading files without any explicit user input 

Y a-t-il un moyen facile de lire le dernier fichier téléchargé?

+0

Lecture du fichier à partir d'une URL, par exemple '/ Téléchargements/aléatoire.txt '- c'est ce qui doit être lu et ensuite publié – user1320651

+0

Voir les informations dans [cet article] (https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Working_with_files) ainsi que le code lié exemples. – K3N

+0

N'aide pas. Je ne peux pas lire le fichier de toute façon – user1320651

Répondre

6

L'API WebExtension ne permet plus aux extensions de lire les fichiers locaux. Vous pouvez laisser l'extension obtenir le privilège CORS et lire le contenu directement depuis l'URL via fetch() ou XMLHttpRequest() comme blob et stocker directement dans IndexedDB ou la mémoire, puis encoder et envoyer au serveur. Cela vient avec many restrictions and limitations comme à quelle origine vous pouvez lire et ainsi de suite.

De plus, cela ajouterait potentiellement de nombreuses étapes inutiles. Si le but est, comme il semble être dans la question à l'heure actuelle, de partager le fichier téléchargé avec un serveur, je suggère plutôt que vous obteniez le dernier objet DownloadItem, extrayez l'URL (.url) de cet objet et envoyez le URL Retour au serveur. De cette façon, le serveur peut charger directement à partir de cette URL (et l'encoder sur le serveur si nécessaire). La charge du réseau sera à peu près la même (un peu moins car il n'y a pas d'encodage Base64 impliqué, ce qui ajoute 33% à la taille), et beaucoup moins de charge sur le client. Le serveur lirait les données sous la forme d'un flux de données binaire/octet; à peu près la même chose que si les données étaient envoyées directement à partir de l'extension.

Pour obtenir le dernier fichier téléchargé vous procédez comme suit à partir d'un script privilégié:

browser.downloads.search({ 
    limit: 1, 
    orderBy: ["-startTime"] 
}) 
.then(getLastDownload); 

function getLastDownload(downloads) { 
    if (downloads.length) { 
    var url = downloads[0].url; 
    // ... send url to the server and let server fetch the data from it directly 
    } 
} 
+0

Pour être juste, j'ai déjà indiqué que c'était possible dans les commentaires précédents, il ne semble pas contourner la solution . – user1320651

+0

J'ai regardé la messagerie native et l'exécution d'une petite application pour faire le travail de grognement pour moi, ce n'est pas idéal, mais étant donné que je ne peux pas lire tout fichier téléchargé en raison des directives MDN dans FF pour la sécurité. Il est possible d'installer une application à côté de l'extension Web pour prendre les paramètres de l'API de téléchargement, puis de lire le fichier localement et de le publier sur le serveur – user1320651

+0

Le dernier fichier browser.downloads.search ne présente pas le dernier téléchargement 100% du temps. Si un téléchargement est en cours, j'ai besoin d'attendre que cela se termine puis envoyez-le au serveur, j'ai donc choisi d'utiliser un eventListener à la place – user1320651

2

Selon this support mozilla question.

(2) Sécurité des fichiers locaux

limites Firefox d'accès des pages sur les serveurs Web vers des pages sur le disque local ou les chemins UNC. [...]).

Quelle solution?

et/ou

  • exécuter un petit serveur web local sur le côté client, en supposant que le serveur a été exécuté avec des privilèges suffisants, vous pouvez enfin accéder à tous les locaux contenu via http: // (mais ne peut toujours pas avec le fichier: ///)