2016-03-19 10 views
6

Voglio scrivere in txt di qualsiasi file da chrome (Tutte le versioni) usando html5 e javascript o jquery.Come scrivere nel file (directory utente) usando JavaScript?

Ho provato FileSystem API e il codice ho provato è:

 
function onFs(fs) { 
console.log('test'); 
    fs.root.getFile('log.txt', {create: true, exclusive: true}, 
     function(fileEntry) { 
     // fileEntry.isFile === true 
     // fileEntry.name == 'log.txt' 
     // fileEntry.fullPath == '/log.txt' 

     fileEntry.getMetaData(function(md) { 
      console.log(md.modificationTime.toDateString()); 
     }, onError); 

     }, 
     onError 
); 
} 

window.webkitRequestFileSystem(TEMPORARY, 1024*1024 /*1MB*/, onFs); 

Ma non funziona.

C'è un modo per scrivere nel file?

+0

Qualsiasi errore gettato? Ed è desktop chrome.v13 o +? – choz

+0

Nessun errore ma il file non è stato creato anche console.log non viene visualizzato nulla. La versione di Chrome è 45 –

+0

@BhumiShah È necessario richiedere all'utente di scaricare il file creato? – guest271314

risposta

3

I want to write file in user directory

Non è possibile scrivere direttamente sul file system dell'utente.

Dopo aver cercato SO domande simili a risolvere con precisione domanda, era in grado di $ cat contenuto del file creato in plnkr seguono questo answer inviato da @Iain a Where does PERSISTENT file system storage store with chrome?. Il file è stato scritto nel file system dell'utente nella directory ~/.config/[chrome, chromium].

file manager servono per navigare

~/.config/[chrome, chromium]/Default/File System 

di rivedere la directory; il file contenente il testo scritto sotto, è stato trovato in una cartella con due cifre come nome di cartella, quindi all'interno di altre due sottodirectory; una sottodirectory con una singola lettera minuscola come nome della cartella; all'interno di questa sottodirectory c'era un'altra sottodirectory con due cifre come nome della cartella; il file che è stato scritto da window.webkitRequestFileSystem aveva otto cifre come nome di file, senza un'estensione, pur avendo corretto il tipo MIME "text/plain"; impostato su Blobtype proprietà.

Poi alla terminal

$ cd ~/.config/[chrome, chromium]/Default/File\ System/[three digits]/[lowercase letter]/[two digits] 

    $ cat [eight digits] 
    Lorem Ipsum 

Non ho provato a creare un file .sh ed eseguirlo. Probabilmente sarà necessario posizionare la directory in path o spostare il file in una cartella esistente path; impostare appropriato permissions per il file. Potrebbe eventualmente regolarlo alle impostazioni del browser cromo/cromo, anche se non ho provato neanche questo.

Probabilmente si potrebbe scrivere un comando per copiare o spostare il file a /path/to/file in una cartella in path ed eseguire il file; o altro approccio.


È possibile utilizzare l'attributo download di a elemento per consentire il download di file creato da createWriter al file system utente.

The file system is sandboxed

Because the file system is sandboxed, a web app cannot access another app's files. You also cannot read or write files to an arbitrary folder (for example, My Pictures and My Documents) on the user's hard drive.

vedi anche Definititons

persistent storage Persistent storage is storage that stays in the browser unless the user expunges it or the app deletes it.
temporary storage Transient storage is available to any web app. It is automatic and does not need to be requested, but the browser can delete the storage without warning.


I want to write file in user directory because it has to be user understandable.

Modifica, aggiornato

È possibile utilizzare il metodo sopra descritto.Cioè, usare un file manager a rivedere come le cartelle ei file vengono visualizzati in

~/.config/[chrome, chromium]/Default/File System 

    ## do stuff with contents of file written by `window.requestFilesystem` 

Per visualizzare file in cromo/cromo FileSystem sarà possibile passare a DevTools ->Experiments -> controllare FileSystem inspection, log.txt dovrebbe essere elencato alla scheda Resources allo FileSystem.

può anche passare a depositare presso la barra degli indirizzi utilizzando URL

filesystem:http://run.plnkr.co/temporary/log.txt 

che dovrebbe avere contenuti

Lorem Ipsum 

o

filesystem:http://run.plnkr.co/temporary/ 

per visualizzare tutti i file e le directory nella radice di temporanea filesystem

Vedi Exploring the FileSystem API

Primo lancio cromo/cromo con --allow-file-access-from-files flag, vedere How do I make the Google Chrome flag "--allow-file-access-from-files" permanent?.

Successivo

window.requestFileSystem = window.requestFileSystem 
          || window.webkitRequestFileSystem; 

occupa delle

function errorHandler(e) { 
    var msg = ''; 

    switch (e.message) { 
    case FileError.QUOTA_EXCEEDED_ERR: 
     msg = 'QUOTA_EXCEEDED_ERR'; 
     break; 
    case FileError.NOT_FOUND_ERR: 
     msg = 'NOT_FOUND_ERR'; 
     break; 
    case FileError.SECURITY_ERR: 
     msg = 'SECURITY_ERR'; 
     break; 
    case FileError.INVALID_MODIFICATION_ERR: 
     msg = 'INVALID_MODIFICATION_ERR'; 
     break; 
    case FileError.INVALID_STATE_ERR: 
     msg = 'INVALID_STATE_ERR'; 
     break; 
    default: 
     msg = 'Unknown Error'; 
     break; 
    }; 

    console.log('Error: ' + msg); 
} 

si dovrebbe quindi essere in grado di

function writeFile(fs) { 

    fs.root.getFile('log.txt', {create: true}, function(fileEntry) { 

    // Create a FileWriter object for our FileEntry (log.txt). 
    fileEntry.createWriter(function(fileWriter) { 

     fileWriter.onwriteend = function(e) { 
     console.log('Write completed.'); 
     // call `readFile` here 
     window.requestFileSystem(window.TEMPORARY, 1024*1024, readFile, errorHandler); 

     }; 

     fileWriter.onerror = function(e) { 
     console.log('Write failed: ' + e.toString()); 
     }; 

     // Create a new Blob and write it to log.txt. 
     var blob = new Blob(['Lorem Ipsum'], {type: 'text/plain'}); 

     fileWriter.write(blob); 

    }, errorHandler); 

    }, errorHandler); 

} 

window.requestFileSystem(window.TEMPORARY, 1024*1024, writeFile, errorHandler); 

function readFile(fs) { 

    fs.root.getFile('log.txt', {}, function(fileEntry) { 

    // Get a File object representing the file, 
    // then use FileReader to read its contents. 
    fileEntry.file(function(file) { 
     var reader = new FileReader(); 

     reader.onloadend = function(e) { 
     console.log(e.target.result) 
     }; 

     reader.readAsText(file); 
    }, errorHandler); 

    }, errorHandler); 

} 

plnkr errore aggiuntivo http://plnkr.co/edit/EVVNYYUvHiM545T06kMC?p=preview


Nota, in Chrome 38+ è anche possibile creare un oggetto File utilizzando il costruttore new File(); vedi Chrome: Create file input from blob with Javascript?.

No, It is background process, save the data into the file exist in folder.

Questo approccio, inoltre, non verrà automaticamente creato il file creato in una cartella esistente sul file system dell'utente.

Con entrambi gli approcci, è necessario l'intervento dell'utente per salvare il file nel file system dell'utente. Ciò può essere ottenuto utilizzando l'attributo download all'elemento a, data URIHow to export JavaScript array info to csv (on client side)? o un elemento iframeDownload File Using Javascript/jQuery; che dovrebbe richiedere all'utente di selezionare per salvare il file o non salvare il file.


Vedi anche The FileSaver interface, FileSaver.js

+0

Questo log della console del codice "errore sconosciuto" e nessun file generato. Ho eseguito questo codice utilizzando file: //folder/test.html. è corretto? –

+0

@BhumiShah È stato in grado di restituire i risultati previsti al chrome 42 al file ':' protocollo con il flag '--allow-file-access-from-files' e' localStorage' abilitato – guest271314

+0

Ho provato ma ho ricevuto lo stesso errore. –

Problemi correlati