关键词:
【中文标题】Flutter 上传带有进度条的大文件。 App 和 Web 都支持【英文标题】:Flutter upload large file with progress bar. App and Web both support 【发布时间】:2021-06-23 04:49:49 【问题描述】:我遇到上传大文件的问题。当从应用程序上传文件工作正常但网络挂起时,为 Web 和应用程序(本机)编译的颤振应用程序。如何将大文件作为流请求发送。
我是 Flutter 的新手,正在开发当前现有的应用程序,该应用程序具有上传大型教程视频文件和 PDF 文件的功能。要求是在上传文件的过程中显示进度条,目前应用程序我使用了dio
,但它在网页版中挂起,而不是文件不上传操作失败。
目前使用以下包
dependencies:
http: ^0.12.2
dio: ^3.0.10
你能帮我解决这个问题吗?
我正在尝试使用以下代码来实现,但有些代码无法正常工作。 https://github.com/salk52/Flutter-File-Upload-Download
抛出“内存缓冲区分配失败”之类的错误,由于其他包干扰,我无法更新dio
或http的版本。不知何故,我必须使用httpclient
或dio
来实现它。我无法更新包的版本,因为它弄乱了其他包的依赖关系。
示例参考。代码如下: 文件大小约为 500 MB 到 700MB
对于参考。以下代码在代码中使用。
Dio封装示例:
#Dio example start
Future<NormalResponse> addSubjectMaterial(
GetSubjectMaterial objSubMat,
bool isDelete,
PlatformFile objfile,
Function sendProgress,
Function receiveProgress,
dio.CancelToken cancelToken) async
NormalResponse objRes = NormalResponse();
try
print(objSubMat.objMaterial.subjectId);
dio.FormData formData = dio.FormData();
formData.fields.add(MapEntry("ObjSubMat", json.encode(objSubMat)));
formData.fields.add(MapEntry("IsDelete", isDelete.toString()));
formData.fields
.add(MapEntry("ClassesId", AppConstants.classesId().toString()));
if (objfile != null)
formData.files.add(
MapEntry("objfile", await getMultipartFile(objfile, "objfile")));
var resp = await dio.Dio().post(
AppConstants.addUpdateSubjectMaterial,
data: formData,
options: requestConfig,
cancelToken: cancelToken,
onSendProgress: sendProgress,
onReceiveProgress: receiveProgress,
);
// String respStr = resp.toString();
// objRes = NormalResponse.fromJson(json.decode(respStr));
objRes = NormalResponse.fromJson(resp.data);
catch (err)
objRes.err = err.toString();
objRes.isSuccess = false;
objRes.newId = -1;
sendProgress = null;
receiveProgress = null;
return objRes;
#Dio example end
#httpclient example code is there any solution with progress bar in this sample code.
Future<NormalResponse> addUpdateSubjectMaterialHttp(
GetSubjectMaterial objSubMat,
bool isDelete,
PlatformFile objfile,
Function sendProgress,
Function receiveProgress,
dio.CancelToken cancelToken) async
NormalResponse objRes = NormalResponse();
try
var req = http.MultipartRequest(
"POST",
Uri.parse(AppConstants.addUpdateSubjectMaterial),
);
req.headers.addAll(
'Content-type': 'application/json',
'Accept': 'application/json',
);
req.fields['ObjSubMat'] = json.encode(objSubMat);
req.fields['IsDelete'] = isDelete.toString();
req.fields['ClassesId'] = AppConstants.classesId().toString();
if (objfile != null)
req.files.add(http.MultipartFile(
"objFile", objfile.readStream, objfile.size,
filename: objfile.name));
var resp = await req.send();
String result = await resp.stream.bytesToString();
objRes = NormalResponse.fromJson(json.decode(result));
print(objRes.isSuccess);
print(objRes.err);
print("Here done");
catch (err)
print(err);
throw err;
return objRes;
#httpclient
Http package example:
#example start
Future<NormalResponse> addSubjectMaterial(
GetSubjectMaterial objSubMat,
bool isDelete,
PlatformFile objfile,
Function sendProgress,
Function receiveProgress,
dio.CancelToken cancelToken) async
NormalResponse objRes = NormalResponse();
try
print(objSubMat.objMaterial.subjectId);
dio.FormData formData = dio.FormData();
formData.fields.add(MapEntry("ObjSubMat", json.encode(objSubMat)));
formData.fields.add(MapEntry("IsDelete", isDelete.toString()));
formData.fields
.add(MapEntry("ClassesId", AppConstants.classesId().toString()));
if (objfile != null)
formData.files.add(
MapEntry("objfile", await getMultipartFile(objfile, "objfile")));
var resp = await dio.Dio().post(
AppConstants.addUpdateSubjectMaterial,
data: formData,
options: requestConfig,
cancelToken: cancelToken,
onSendProgress: sendProgress,
onReceiveProgress: receiveProgress,
);
// String respStr = resp.toString();
// objRes = NormalResponse.fromJson(json.decode(respStr));
objRes = NormalResponse.fromJson(resp.data);
catch (err)
objRes.err = err.toString();
objRes.isSuccess = false;
objRes.newId = -1;
sendProgress = null;
receiveProgress = null;
return objRes;
#example end
【问题讨论】:
【参考方案1】:您必须使用 Future、await 和 async,它们在后台线程中继续流的任务,同时您的应用程序的 UI 工作顺利。
【讨论】:
能否提供一些示例代码。 好的@DharmeshChauhan 我正在编辑我的答案,但请回复您使用什么来存储数据,firebase 或其他任何东西或 mysql 您好 Manav,感谢您的回复。我正在使用 API 调用它。在 App 版本中,它也可以与简单的 HTML 页面一起正常工作。 @DharmeshChauhan 当我通读您的代码时,您似乎已经正确地实现了所有的东西。我有一个建议为 web 构建一个版本,然后尝试,因为您正在尝试调试模式。谢谢。HTML5:带有进度条的 AJAX 文件上传
】HTML5:带有进度条的AJAX文件上传【英文标题】:HTML5:AJAXfileuploadwithprogressbar【发布时间】:2011-11-0602:38:13【问题描述】:我正在寻找一个带有HTML5进度条的文件上传器。我尝试使用其他地方的一些教程,包括SO。ThisSOanswer(被接... 查看详情
Alamofire 上传带有进度的大文件并在应用重启时显示进度
】Alamofire上传带有进度的大文件并在应用重启时显示进度【英文标题】:Alamofireuploadinglargefileswithprogressandshowprogressonapprestart【发布时间】:2018-08-2012:56:17【问题描述】:我已通过以下步骤设置项目。我已启用外部附件通信和后... 查看详情
简单的跨浏览器,带有进度条的 jQuery/PHP 文件上传 [关闭]
】简单的跨浏览器,带有进度条的jQuery/PHP文件上传[关闭]【英文标题】:Simplecross-browser,jQuery/PHPfileuploadwithprogressbar[closed]【发布时间】:2012-05-1516:03:16【问题描述】:我知道有几个关于此的主题,但没有一个为文件上传脚本提供... 查看详情
带进度条的文件上传?
】带进度条的文件上传?【英文标题】:Fileuploaderwithprogressbar?【发布时间】:2011-09-1108:01:12【问题描述】:如何创建带有进度条的HTML/PHP/AJAX文件上传器?我不知道从哪里开始。【问题讨论】:【参考方案1】:我用过Uploadify。易... 查看详情
带有进度条的 jQuery ajax 上传 - 没有 flash
】带有进度条的jQueryajax上传-没有flash【英文标题】:jQueryajaxuploadwithprogressbar-noflash【发布时间】:2011-02-1210:59:54【问题描述】:我正在寻找类似于uploadify的文件上传器,其进度条不依赖于Flash,最好使用jQuery-这可能吗?【问题... 查看详情
使用 Util.copyStream 的带有进度条的 FTP - JAVA
...09-2002:56:11【问题描述】:我正在使用Util.copyStream()通过FTP上传文件。它在进度条上显示进度,但是当我尝试通过FTP客户端(例如FileZilla)查看文件时,它不存在。谁能帮帮我?这是FTPUpload类:packa 查看详情
使用 HTML5 和 Javascript 录制/上传带有进度条的固定长度视频
】使用HTML5和Javascript录制/上传带有进度条的固定长度视频【英文标题】:Record/UploadafixedlengthvideowithprogressbarusingHTML5andJavascript【发布时间】:2021-07-1900:28:24【问题描述】:我正在用HTML和Java脚本制作一个小项目,用户可以在其中... 查看详情
Extjs文件上传进度
】Extjs文件上传进度【英文标题】:Extjsfileuploadprogress【发布时间】:2013-01-0414:16:50【问题描述】:我在ExtJS4中看到过表单文件上传示例,我需要自定义文件上传的进度。我看到了waitMsg配置属性,但我不想使用它,也不想使用extj... 查看详情
springmvc带进度条的多文件上传
1、关于文件上传进度条的实现在说SpringMVC文件上传尤其是带滚动条之前先用servlet做一个简单的文件上传并返回进度信息这样的功能。(1)需要两个包:commons-fileupload-1.3.1.jarcommons-io-1.4.jar上面这两个包是Apache推出的... 查看详情
在 Xamarin Forms 中下载带有进度条的文件
】在XamarinForms中下载带有进度条的文件【英文标题】:DownloadfilewithprogressbarinXamarinForms【发布时间】:2015-08-1813:32:33【问题描述】:我正在尝试使用下载进度条在XamarinForms(PCL,因此WebClient不可用)中创建一个下载页面。我使用... 查看详情
CodeIgniter 上传进度
】CodeIgniter上传进度【英文标题】:CodeIgniterUploadProgress【发布时间】:2013-04-0302:25:19【问题描述】:我正在尝试使用CI2.1.3上传带有进度条的文件。我已经让文件上传一切正常,但是获得这个文件进度并不容易。我查看了大量具... 查看详情
带有 ProgressDialog 和进度条的 AsyncTask
】带有ProgressDialog和进度条的AsyncTask【英文标题】:AsyncTaskwithaProgressDialogandProgressBar【发布时间】:2011-10-1219:14:01【问题描述】:我正在尝试使用AsyncTask加载确定长度的文件。我的AsyncTask看起来像这样:protectedvoidonPreExecute()dialog=... 查看详情
如何使用进度条快速上传大文件?
】如何使用进度条快速上传大文件?【英文标题】:Howtouploadlargefileinexpresswithprogressbar?【发布时间】:2012-10-1201:46:31【问题描述】:目前我正在使用socket.io上传带有进度条的视频。这是教程http://net.tutsplus.com/tutorials/javascript-ajax/h... 查看详情
关于文件上传下载以及其他进度条的实现
现在我的上传,下载,或者某个批量的进度的进度条实现思路都是这样: 定义一自定义类,列出总数量,完成数(有需求决定可分成功与失败) 然后访问链接的时候进行处理,将session中存入自定义类,自定义类中存入... 查看详情
Inno Setup - 在自定义页面上复制带有进度条的文件
】InnoSetup-在自定义页面上复制带有进度条的文件【英文标题】:InnoSetup-CopyFileswithProgressBaronacustompage【发布时间】:2020-09-2915:38:43【问题描述】:我目前正在开发一个更新我们公司软件的程序。我让用户在“CreateInputDirPage”中选... 查看详情
使用 Java 上传文件(带进度条)
】使用Java上传文件(带进度条)【英文标题】:FileUploadwithJava(withprogressbar)【发布时间】:2010-09-2006:17:55【问题描述】:我对Java非常陌生,而且我主要是边学边自学,所以我开始构建一个小程序。我想做一个可以从本地磁盘中... 查看详情
文件上传进度条干扰控制器重定向
】文件上传进度条干扰控制器重定向【英文标题】:FileuploadprogressbarinterfereswithControllerredirect【发布时间】:2021-11-1610:23:43【问题描述】:我有一个文件提交表单和一个跟踪上传进度的进度条。但是,控制进度条的javascript会干扰... 查看详情
如何使用 Ktor 和 Kotlin 下载带有进度指示器的大文件?
】如何使用Ktor和Kotlin下载带有进度指示器的大文件?【英文标题】:HowcanIdownloadalargefilewithKtorandKotlinwithaprogressindicator?【发布时间】:2021-03-1221:59:11【问题描述】:我花了太多时间试图解决这个问题。因此,我在下面发布的代码... 查看详情