2015-03-18 14 views
6

Sto sviluppando un'estensione per Chrome che salverà i file nella cartella dei download (non è tutto ciò che sta facendo, ma questa è la parte con cui ho problemi). In questo momento mi sto concentrando su file PDF. Fondamentalmente, quando un PDF viene aperto in Chrome, l'utente può salvarlo manualmente usando Menu - Salva file come ..., sto solo cercando di automatizzare questa funzionalità usando l'estensione, ma non ho trovato un buon modo per fallo.Estensione Chrome - salvataggio file PDF

Diciamo che posso rilevare se la scheda corrente contiene un file PDF (in base alle risposte dalla domanda this).

La cosa migliore che ho capito finora è di avviare un download:

chrome.downloads.download({ 
    url: tabs[0].url, saveAs: false, 
    filename: "my file", /* This will be some unique autogenerated identifier */ 
    conflictAction: "overwrite" 
}); 

Questo funziona, ma ha 2 svantaggi:

  • Il file deve essere ri-scaricato, che è un dolore se è grande. Inoltre, il file è già stato scaricato quindi dovrei essere in grado di usarlo.
  • Per qualche motivo questo non funziona con i file aperti localmente ("file: // ..."). Genera NETWORK_INVALID_REQUEST e non scarica.

C'è un modo migliore per salvare il file?

+0

I havent trovato un modo, attraverso un API, per accedere ai file locali salvati da qualche parte sul dispositivo. Alcune soluzioni hanno indicato NPAPI, ma ora è deprecato. – Rivero

+0

@Rivero: In realtà non ho bisogno di accedere (leggere) il file locale. Ho solo bisogno di salvare il PDF aperto da qualche parte e ottenere il percorso del file sul disco, che l'API di download può fare. Tuttavia, soffre dei problemi che ho citato. – vesan

risposta

1

Indirizza solo il file: // aspetto del problema. La tua estensione ha il permesso di accedere al file: //. Per poter accedere alla tua estensione è necessario chiedere il file: // / e l'utente deve concedere manualmente questo accesso dalla pagina delle estensioni. È possibile verificare se si dispone dell'autorizzazione necessaria utilizzando https://developer.chrome.com/extensions/extension#method-isAllowedFileSchemeAccess.

Vedere Adding file://. permission to chrome extension per ulteriori informazioni sull'accesso al file: // urls. Potresti anche trovare utile How can I enable my chrome extension in incognito mode?.

Per una discussione correlata (anche se non specifica per il tuo caso d'uso poiché hai già un file PDF), vedi anche https://code.google.com/p/chromium/issues/detail?id=169337.

+0

Grazie mille per i collegamenti. Il file: // in realtà non è così difficile da risolvere, perché il punto dell'estensione è quello di ottenere i file attualmente aperti sul disco. Se è file: //, è già lì, quindi posso solo usarlo. Preferirei avere un unico modo per salvare http: // e file: // PDF, ma dovrò fare un caso speciale per il file: //, perché non posso aspettarmi che i nostri utenti si facciano incazzare impostazioni. – vesan

3

nota, i browser di cromo/cromo sembrano accodare embed elemento da document.body per visualizzare i file .pdf

  1. a) rilevare pdf utilizzando window.location.href, document.querySelectorAll("embed")[0].type;

    b) utilizzando XMLHttpRequest richiedere document esistente, che dovrebbe tornare pdfdocument come blob risposta, da cache; vedi console ->Network ->Headers ->Status Code

  2. per consentire l'apertura file: al browser di cromo/cromo, provare utilizzando bandiera riga di comando --allow-access-from-files; vedi How do I make the Google Chrome flag “--allow-file-access-from-files” permanent?


A .pdfdocument, cioèg; Ecma-262.pdf provare

// check if `document` is `pdf` 
if (/pdf/i.test(window.location.href.slice(-3)) 
    || document.querySelectorAll("embed")[0].type === "application/pdf") { 
    var xhr = new XMLHttpRequest(); 
    // load `document` from `cache` 
    xhr.open("GET", "", true); 
    xhr.responseType = "blob"; 
    xhr.onload = function (e) { 
     if (this.status === 200) { 
      // `blob` response 
      console.log(this.response); 
      var file = window.URL.createObjectURL(this.response); 
      var a = document.createElement("a"); 
      a.href = file; 
      a.download = this.response.name 
         || document.querySelectorAll("embed")[0].src 
          .split("/").pop(); 
      document.body.appendChild(a); 
      a.click(); 
      // remove `a` following `Save As` dialog, 
      // `window` regains `focus` 
      window.onfocus = function() {      
       Array.prototype.forEach.call(document.querySelectorAll("a") 
       , function (el) { 
        document.body.removeChild(el) 
       }) 
      } 
     }; 
    }; 
    xhr.send(); 
}; 
+0

Il 'XMLHttpRequest' che ottiene il file dalla cache sembra utile, ci provo. La mia unica preoccupazione è un caso in cui il PDF è generato dal server come risultato di una richiesta POST, il GET potrebbe non darmi la stessa cosa. – vesan

Problemi correlati