2014-11-03 16 views
7

Ich arbeite seit ein paar Monaten an einem Projekt und ich stehe kurz vor dem Ende. Einer der letzten Schritte besteht darin, eine Datei bereitzustellen, die mit Informationen gefüllt wird, die durch Aktionen des Benutzers während ihrer Sitzung erzeugt wurden. Can I write files with HTML5/JS? und die Antwort von Ecmanaut hat mich sehr nah gebracht, da er zwei Methoden zur Verfügung stellte, eine in reinem html5 und eine mit JavaScript.HTML5 JavaScript Download Attribut

Ich hatte zuerst die JavaScript-Methode verwendet, die nur in Chrome funktionieren würde, nicht in Mozilla oder IE. Also habe ich die reine html5-Methode in Kombination mit etwas alternativem JavaScript verwendet, um sie auf die Seite zu kopieren, so dass sie klickbar war.

document.getElementById('download').innerHTML = '<a id="save" download="earth.txt" href="data:text/plain,mostly harmless&#10;and a bit more">Save</a>'; 

Dieser Code erstellt eine Datei, die heruntergeladen wird, aber nicht die Newline enthalten, die der Artikel sagte, war ‚ ‘. Also habe ich gesucht, um zu sehen, welche anderen Zeichencodes erkannt werden können. http://en.wikipedia.org/wiki/Newline hat mir viele mögliche Möglichkeiten zur Verfügung gestellt, keine, die ich versucht habe, haben funktioniert. Die, die ich versucht habe, sind: '& # 10', ' ', '& # 13', ' ', '\ r \ n', '\ r', '\ n', '\ cr', ' \ c \ r ', 0x0D, 0x0A, 0c0D0A. In vielen Fällen wurde die neue Zeile entfernt und nichts würde erscheinen.

Beim Testen des obigen Codes funktioniert es in Mozilla und Chrome (minus der Newline), aber das Ergebnis in IE ist anders. Wenn Sie auf den Link "Speichern" klicken, wird die URL tatsächlich als Seite mit den Dateninhalten angezeigt.

Während das Projekt akzeptabel sein könnte, ohne dass diese Funktion funktioniert, würde ich sehr gerne arbeiten, nachdem ich so viel Zeit und Mühe damit verbracht habe und so nah gekommen bin. Ich muss das auch in Safari testen, aber ich habe noch keine Tests in diesem Browser durchgeführt. Browser-Unterstützung erforderlich von den wichtigsten zu den wenigsten ist wie folgt: Mozilla, Chrome, Safari, IE. Wenn möglich, möchte ich eine browserspezifische Codierung vermeiden.

Ich sollte auch erwähnen, dass wie in der ersten Link, ich möchte nicht an einen Server senden, um den Download zu haben, ich brauche es lokal auf der Client-Seite ohne Server-Interaktion zu arbeiten.

Also, um zusammenzufassen, muss ich zumindest die Newline für die Datei arbeiten, so dass Mozilla und Chrome beide voll funktionsfähig sind. Und wenn möglich, einen Weg, um die Datei auch im IE arbeiten zu lassen.

Bearbeiten: 3. November 2014 13:40 Uhr Ortszeit Ich habe versucht, die vorgeschlagene Bearbeitung von maths4js über meine Angebote ändern und der Vorschlag hat nicht funktioniert. Ich wurde darauf aufmerksam, dass das Einreichen einer größeren Beispielseite Code eine hilfreiche Idee wäre. Es wurde auch vorgeschlagen, dass ich schaue, um zu sehen, welche Browser diese Funktion unterstützen http://caniuse.com/#feat=download und es scheint, dass IE und Safari nicht, so werde ich nicht über sie im Moment kümmern und vielleicht die Straße hinunter haben Browser spezifische Codierung für sie.

<!DOCTYPE HTML> 
<html> 
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><style>body{margin: 0px;padding: 0px;}</style></head><body><center><br><div id='download'></div></center> 
<script> 
function download(){ 
//var newline= '&#10'; //no line breaks 
//var newline= '&#10;'; //no line breaks 
//var newline= "&#10;"; //no line breaks 
//var newline= "&#10";   //no line breaks 
//var newline= "\r\n";  //no line breaks 
//var newline= "\r\n;";  //appends ; but no line breaks 
//var newline = '\n';  //no line break 
//var newline = '/n'; //completely failed 
var newline = 0x0D0A; 
var tab = "  "; 
var text = "Title of the document" + newline; 
text += "Just a line of text : "; 
text = text +"Random"; 
text = text + newline + "Trial" + tab + "Time" + tab + "Correct" + newline; 
//document.getElementById('download').innerHTML = '<a id="save" download="This_File.txt" href="data:text/plain,'+text+'">Save</a>'; 
//document.getElementById('download').innerHTML = '<a id="save" download="earth.txt" href="data:text/plain,mostly harmless&#10;and a bit more">Save</a>'; 
document.getElementById('download').innerHTML = "<a id='save' download='earth.txt' href='data:text/plain,mostly harmless&#10;and a bit more'>Save</a>"; 
} 
download(); 

</script> 
</body> 
</html>  

Ich möchte Ihnen allen für die Mühe und Zeit danken, die Sie mir bereits gegeben haben.

+0

Die html5-Lösung funktioniert natürlich nur in Browsern, die das Download-Attribut unterstützen. –

Antwort

4

Versuchen Sie, Ihren Text in base64 über das Fenster zu konvertieren.btoa Funktion:

var myText = btoa('mostly harmless\n\rand a bit more'); 
 
document.getElementById('download').innerHTML = '<a id="save" download="earth.txt" href="data:text/plain;base64,' + myText + '">Save</a>';
<div id="download"></div>

Sollte funktionieren, wie base64 richtig codiert/die neue Linie Charakter beibehält.

+1

Diese Lösung war genau das, was für diese Anwendung benötigt wurde, vielen Dank. –

+1

Eine Sache zu beachten - beachten Sie, dass die Ausgabe der base64-Funktion tatsächlich etwa 33% größer als die ursprüngliche Zeichenfolge ist. Ich denke nicht, dass es einen großen Einfluss auf die Performance haben wird, solange Sie nicht wirklich große Dateien (wie Megabyte Text) erstellen wollen, aber es lohnt sich, daran zu denken, denke ich. –

+0

Danke Michal, das ist gut zu wissen, aber in diesem Fall ist es kein Problem. Die erwartete Dateigröße sollte niemals 15 Zeilen überschreiten. –

1

Dies funktioniert für mich, ich benutze „\ r \ n“ für neue Linien verwendet werden, wenn mit dem Windows-System, sonst \ n

var textToWrite = txt; //plain text with \r\n for new lines if used with Windows System, otherwise \n is enough 
var fileNameToSaveAs = session_title.innerText + '.txt'; //TODO: filename should be first 10chars of noweirdchrs(title)... 

var textFileAsBlob = new Blob([textToWrite], {type:'text/plain;charset=utf-8'}); 

<a id='downloadLink_id'></a> 

downloadLink = document.getElementById('downloadLink_id'); 
downloadLink.download = fileNameToSaveAs; 
downloadLink.innerHTML = "Download File"; 
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob); 

Sehen sie in Aktion auf meinem speech recognition chrome app genug ist - eine des Exports Optionen zu txt oder srt Dateien ...

+0

Ich muss diese Lösung später versuchen (und hoffe, dass es für alle 4 Browser funktioniert). Danke, dass Sie sich die Zeit genommen haben, dies zu veröffentlichen. Ich schreibe es in meine Akte, damit ich es nicht vergessen kann. –

Verwandte Themen