有办法把大文件上传到服务器吗?
我正在使用MultipartRequest
和MultipartFile
,如下所示:
List<int> fileBytes) async {
var request = new http.MultipartRequest("POST", Uri.parse(url));
request.files.add(http.MultipartFile.fromBytes(
'file',
fileBytes,
contentType: MediaType('application', 'octet-stream'),
filename: fileName));
request.headers.addAll(headers);
var streamedResponse = await request.send();
return await http.Response.fromStream(streamedResponse);
并阅读该文件,如下所示:
html.InputElement uploadInput = html.FileUploadInputElement();
uploadInput.multiple = false;
uploadInput.draggable = true;
uploadInput.click();
uploadInput.onChange.listen((e) {
final files = uploadInput.files;
final file = files[0];
final reader = new html.FileReader();
reader.onLoadEnd.listen((e) {
setState(() {
_bytesData =
Base64Decoder().convert(reader.result.toString().split(",").last);
_selectedFile = _bytesData;
});
});
reader.readAsDataUrl(file);
});
对于30MB左右的文件是可以的,但是对于超过30MB的文件,我得到的是Error code: Out of Memory
.
我做错什么了吗?我在某个地方看到
MultipartFile.fromBytes会给予你一些大文件的问题,因为浏览器会限制你的内存消耗。
我认为他的解决方案是:
有一个fromStream构造函数。通常,对于较大的文件,我只使用HttpRequest,并将File对象放在FormData示例中。
我使用MultipartFile
和MultipartFile.fromString
,两次(150 MB文件)都再次发生。我如何使用此解决方案?或者对于超过500 MB的文件,是否有更好的方法?
更新
使用Worker
添加了一个答案。这不是一个很好的解决方案,但我认为这可能会帮助一些人。
2条答案
按热度按时间ar7v8xwq1#
更新
here提供了一个项目,用于展示如何使用此解决方案和进度指示器完成此任务。
目前,我使用这种方法解决了这个问题:
导入:
Flutter部位:
JavaScript部分:
在web文件夹(index.html旁边)中,创建文件“upload_worker.js”。
6qqygrtg2#
我只用Dart代码解决了这个问题:要走的路是使用一个块上传.这意味着手动发送文件的小部分.我发送99MB每个请求例如.已经有一个基本的实现这个在线:https://pub.dev/packages/chunked_uploader
你必须得到一个流,这可以通过file_picker或drop_zone库来实现。我使用drop_zone库是因为它提供了文件选择器和放置区功能。在我的代码中,
dynamic file
对象来自drop_zone库。也许你需要根据你的后端来调整块上传器的功能。我使用了一个django后端,在那里我写了一个简单的视图来保存文件。在小文件的情况下,它可以接收多个文件的多部分请求,在大文件的情况下,它可以接收块,如果收到前一个块,它可以继续写文件。下面是我的代码的一些部分:
Python后端:
flutter chunk uploader在我的版本:
上载代码,决定是在一个请求中上载多个文件,还是将一个文件分为多个请求:
希望这能给你一个很好的概述我是如何解决这个问题的。