颤振网页下载选项



我正在制作应该从用户数据生成文件的颤振网络应用程序。并可以选择下载输出文件。

但是我找不到任何适用于颤振网络:(的选项/包

有人可以帮我吗?

用于重定向到下载URL的简单代码

import 'dart:html' as html;
void downloadFile(String url) {
html.AnchorElement anchorElement =  new html.AnchorElement(href: url);
anchorElement.download = url;
anchorElement.click();
}

您可以将包url_launcher与url_launcher_web一起使用

然后你可以做:

launchUrl(Uri.parse("data:application/octet-stream;base64,${base64Encode(yourFileBytes)}"));

编辑: 如果你这样做,你不需要插件

下载.dart:

import 'dart:convert';
// ignore: avoid_web_libraries_in_flutter
import 'dart:html';
void download(
List<int> bytes, {
String downloadName,
}) {
// Encode our file in base64
final _base64 = base64Encode(bytes);
// Create the link with the file
final anchor =
AnchorElement(href: 'data:application/octet-stream;base64,$_base64')
..target = 'blank';
// add the name
if (downloadName != null) {
anchor.download = downloadName;
}
// trigger download
document.body.append(anchor);
anchor.click();
anchor.remove();
return;
}

empty_download.飞镖:

void download(
List<int> bytes, {
String downloadName,
}) {
print('I do nothing');
}

导入和使用:

import 'empty_download.dart'
if (dart.library.html) 'download.dart';
void main () {
download('I am a test file'.codeUnits, // takes bytes
downloadName: 'test.txt');
}

触发下载的一种方法是适应"本机"JavaScript中使用的常见模式,创建一个具有download属性的锚元素并触发点击。

import 'dart:convert';
import 'dart:html';
main() {
File file = // generated somewhere
final rawData = file.readAsBytesSync();
final content = base64Encode(rawData);
final anchor = AnchorElement(
href: "data:application/octet-stream;charset=utf-16le;base64,$content")
..setAttribute("download", "file.txt")
..click();
}

我找到了一个解决方案,让我发出授权请求来获取文件(使用包 http.dart(,然后使用 flutter web(使用包 dart:html(下载文件。我不知道其他人是否需要这个,但我无法找到解决方案,所以这里是代码。

import 'package:http/http.dart';
import 'dart:html' as html;

var headers = {
'Content-Type': 'application/octet-stream',
'Accept': 'application/octet-stream',
'Authorization' : 'Bearer [TOKEN HERE]'
};
Response res =
await get(url, headers: headers); 
if (res.statusCode == 200) {
final blob = html.Blob([res.bodyBytes]);
final url = html.Url.createObjectUrlFromBlob(blob);
final anchor = html.document.createElement('a') as html.AnchorElement
..href = url
..style.display = 'none'
..download = filename;
html.document.body.children.add(anchor);
anchor.click();
html.document.body.children.remove(anchor);
html.Url.revokeObjectUrl(url);
}

一个好的解决方法是使用

import 'dart:html' as html;
openInANewTab(url){
html.window.open(url, 'PlaceholderName');
}

非常适合我的用例。

我使用以下内容从 URL 下载文件,

import 'dart:html' as html;
void downloadFileFromDownloadableLink(String url, String fileName) {
html.AnchorElement anchorElement = html.AnchorElement(href: url);
anchorElement.download = fileName;
anchorElement.click();
}

对赏金的回应:

音频文件的情况只是开始播放而不是下载它

我对视频做了同样的事情,但我相信它也适用于音频。我假设,您生成的音频是一个数组或斑点

import 'dart:js' as JS;
import 'dart:html' as HTML;
const mimeType = 'audio/wav'; // TODO: Pick a right format
void downloadFile(List chunks) async {
final blob = HTML.Blob(chunks, mimeType);
final objectUrl = await HTML.Url.createObjectUrlFromBlob(blob);
final a = HTML.AnchorElement();
a.href = item.url;
a.download = "my_audio_file_${DateTime.now()}.wav";
HTML.document.body.append(a);
a.click();
// Wait for click event to be processed and cleanup
await Future.delayed(Duration(milliseconds: 100));
a.remove();
HTML.Url.revokeObjectUrl(item.videoObjectUrl);
}

对我来说,vishwajit76的答案对我有用。如果您希望文件在下载后具有自定义名称,请执行以下操作

`void downloadFile(String url) {
html.AnchorElement anchorElement = html.AnchorElement(href: url);
anchorElement.download = "myDocument.pdf"; //in my case is .pdf
anchorElement.click();
}`

所有其他解决方案都是正确的,但此解决方案可能会泄露您的存储路径结构。因为下载的文件名包括文件的完整路径名。如果您的路径包含 Firebase 用户的 uid 数量,这也可能会导致安全漏洞。这可能是一个极端的例子,但最好在文件路径上使用 uid 号来创建更安全的存储。您可以在根目录上创建临时下载文件夹(下载/用户电子邮件(,然后通过 Firebase 函数复制要下载的文件(下载/用户电子邮件(中的节点.js代码。当用户单击从客户端下载按钮时,将调用此函数。您可以稍后删除临时下载文件夹。

const functions = require("firebase-functions");
const {Storage} = require("@google-cloud/storage");
const storage = new Storage();
exports.downloadFile = functions.https.onCall(async (data, context)=> {
await storage.
bucket("my-bucket-name").
file(data.filePath).
copy(storage.
bucket("my-bucket-name").
file(`Download/${data.useremail}/${data.fileName}`));
});

你也可以使用 dio 插件,它支持这种开箱即用的东西。所以你可以做:

response = await dio.download('url-to-downloadable', 'path-to-save-to');

这是他们的API文档。

最新更新