我有以下代码来上传文件。
var client = new dio.Dio();
await client.put(
url,
data: formData,
options: dio.Options(
headers: headers,
),
onSendProgress: (int sent, int total) {
final progress = sent / total;
print('progress: $progress ($sent/$total)');
},
);
Run Code Online (Sandbox Code Playgroud)
上传文件工作正常。问题是,我有一个视图,它有一个圆形进度条,指示onSendProgress触发时的上传进度。当我上传一个 ~10MB 的文件时,进度条会在一秒钟内从 0% 跳到 100%,然后在继续执行其余代码之前等待几秒钟(取决于文件大小)。这对我来说似乎很奇怪,因为我希望进度条会逐渐增加进度。
您可以在下面找到我的示例中的打印输出,其中包含一个 ~10MB 的文件。
flutter: progress: 0.000003035281907563734 (29/9554302)
flutter: progress: 0.000013187776563897604 (126/9554302)
flutter: progress: 0.999996546058519 (9554269/9554302)
flutter: progress: 0.9999967553883057 (9554271/9554302)
flutter: progress: 1.0 (9554302/9554302)
Run Code Online (Sandbox Code Playgroud)
这是一个较小的文件,但具有相同数量的回调。
flutter: progress: 0.00001847214941293598 (29/1569931)
flutter: progress: 0.00008025830434585978 (126/1569931)
flutter: progress: 0.9999789799679094 (1569898/1569931)
flutter: progress: 0.9999802539092483 …Run Code Online (Sandbox Code Playgroud) 我正在使用MultipartRequestfrom 上传文件package:http.我正在成功上传文件,但我想获取正在上传的文件的进度.我怎样才能做到这一点?我当前的代码看起来像这样
Future submitFile(var report, File file) async {
var uri = Uri.parse(endpoint + "v1/reports");
var request = http.MultipartRequest("POST", uri);
await addHeaders(request.headers);
request.fields.addAll(Report.toMap(report));
if (file != null)
request.files.add(await http.MultipartFile.fromPath(
'report_resource',
file.path,
));
String response = "";
await (await request.send()).stream.forEach((message) {
response = response + String.fromCharCodes(message);
});
return response;
}
Run Code Online (Sandbox Code Playgroud)
我搜索了解决方案,找到了这个.而这个职位是有点不相似,我想实现的,因为他是用不同的客户端的请求.
也许我没有在正确的道路上寻找.感谢帮助.
我正在尝试为下载文件制作一个进度条指示器,但是如果我向 中添加一个侦听器StreamedResponse,管道会起作用,但不会完成它的未来。
final client = new http.Client();
http.StreamedResponse response = await client.send(http.Request("GET", Uri.parse('someurl')));
var received = 0;
var length = response.contentLength;
//if I remove this listener, the await below gets completed
var listen = response.stream.listen((List<int> bytes) {
received += bytes.length;
print("${(received / length) * 100} %");
});
var sink = downloadFile.openWrite();
await response.stream.pipe(sink);
listen.cancel();
sink.close();
Run Code Online (Sandbox Code Playgroud)
在github 上,他们已经建议某人它应该可以工作,但在StreamedResponse 文档中,它保持不变This should always be a single-subscription stream.。因此,添加一个侦听器来计算百分比似乎会以某种方式产生错误StreamedResponse。关于如何让它发挥作用的任何想法?
我在使用 BloC 模式并结合使用 Dio 显示下载过程时遇到问题。
谁能告诉我,如何从 dio 获取 onUploadProgress 进入块状态并在状态内的进度更新时显示它?
目前我有 UI、BloC 和 API 类。我需要将我的块传递到 API 调用中以下载文件,然后添加一个额外的事件,如下所示:
onReceiveProgress: (int received, int total) => {
bloc.add(DownloadingImages((received / total) * 100))
});
Run Code Online (Sandbox Code Playgroud)
我还发现了一个大问题,但我不知道如何以干净的方式解决。如果我添加 DownloadingImage 状态并传递该过程,它不会更新 UI。发生这种情况是因为状态不会改变,而只是状态内部的值发生变化。BlocBuilder 无法识别状态内部的值变化,也不会重新渲染 UI...
所以我有另一个解决方法(BloC):
if (state is ImagesDownloading) {
imageBloc.add(DownloadingImages2(state.progress));
if (state.progress < 100) {
return DownloadAndProgressWidget(
done: false, progress: state.progress);
} else {
return DownloadAndProgressWidget(done: true, progress: 100);
}
} else if (state is ImagesDownloading) {
imageBloc.add(DownloadingImages2(state.progress));
if (state.progress < 100) {
return DownloadAndProgressWidget(
done: false, …Run Code Online (Sandbox Code Playgroud) 我想通过这样的非multipart/form-data请求上传文件:
POST http://127.0.0.1/upload
Cache-Control: no-cache
< /path/to/file/in/disk
Run Code Online (Sandbox Code Playgroud)
(我测试并成功将文件从 JetBrain Rider 的 REST 客户端上传到我的 REST 端点。)
包中有一个StreamedRequest类,http但我没有找到任何构造函数或设置器来将字节流或文件内容插入其中。
如何使用StreamedRequestDart 上传文件?