在我的网络应用程序中,我使用此代码将字符串下载到本地光盘上的文件:
void downloadFile(String filename, String text){
AnchorElement tl = document.createElement('a');
tl..attributes['href'] = 'data:text/plain;charset=utf-8,' + Uri.encodeComponent(text)
..attributes['download'] = filename
..click();
}
但这会删除所有换行符(“\ n”)。我需要做些什么来保护它们?
从Dart 1.14开始,有一个UriData
类,它可以更容易地使用data:
URI。您可以在这里使用它:
void downloadFile(String filename, String text){
AnchorElement tl = document.createElement('a');
var href = UriData.fromString(text, encoding: UTF8);
tl..attributes['href'] = href.toString()
..attributes['download'] = filename
..click();
它应确保使用正确的编码来保留换行符。
如果文件太大,data:
Uri会导致浏览器发出“下载错误”信号。
相反,创建一个临时Blob,仍应保留换行符:
AnchorElement tl = document.createElement('a');
var href = Url.createObjectUrl(new Blob([text]));
tl..attributes['href'] = href
..attributes['download'] = filename
..click();
我无法让“data:text / html”工作(我不是专家),所以我使用“data:text / csv”,并下载一个csv文件。如果用户需要文本文件,他们可以在电子表格中打开并导出。它实际上适合我的目的。
void downloadFile(String filename, String text) {
text=text.replaceAll('\n','%0A');
text=text.replaceAll('\t','%2C');
text="data:text/csv,"+text;
AnchorElement tl = document.createElement('a');
tl
..attributes['href'] = text
..attributes['download'] = filename
..click();
}
我会称之为:
String s="one two \n three four \n five\tsix\t 7";
downloadFile('test.csv',s);
如果你:
downloadFile('test.txt',s);
新行和标签被删除。