Flutter获取大文件MD5值的方法
最近一直在搞flutter,有一个需求是将一个不到1G的大文件从App端上传到服务器,为了做文件校验所以要获取到服务器托管网文件的MD5。 1.第一步首先获取到文件,并计算出文件大小和分快的数目
File file = File(path);
int fileSize = file.lengthSync();
int totalPart = (fileSize * 1.0 / partSize).ceil();
static const int partSize = 1024 * 1024 * 3; //默认3m每块
2.第二步导入flutter 官方的convert库
import 'package:convert/convert.dart' as convert;/起一个别名
int start; //开始读文件的位置
int length; //读取文件的长度
var output = convert1.AccumulatorSink();
var input = md5.startChunkedConversion(output);//这是一个sink 会把所有块的md5拼接到一起
3.第三部循环所有分快
int currentPart = 0;
while (currentPart fileSize) ? (fileSize - start ) : partSize;
//每块读取的位置
RandomAccessFile raf = file.openSync(mode: FileMode.read);
raf.setPositionSync(start);
Uint8List data = raf.readSync(length);
input.add(data);
currentPart++;
}
4.获取最终md5,关闭sink
input.close();
var digest = output.events.single.toString();
return digest;
5.完整方法调用
String _getMd5(String path) {
File file = File(path);
int fileSize = file.lengthSync();
i服务器托管网nt totalPart = (fileSize * 1.0 / partSize).ceil();
int start; //开始读文件的位置
int length; //读取文件的长度
var output = convert.AccumulatorSink();
var input = md5.startChunkedConversion(output);
int currentPart = 0;
while (currentPart fileSize) ? (fileSize - start ) : partSize;
RandomAccessFile raf = file.openSync(mode: FileMode.read);
raf.setPositionSync(start);
Uint8List data = raf.readSync(length);
input.add(data);
currentPart++;
}
input.close();
var digest = output.events.single.toString();
return digest;
}
大文件实现分块上传和断点续传
1.将文件进行分块,我们和后台约定的是3M每块
static const int partSize = 1024 * 1024 * 3; //3m每块
///上传文件 后台要记录从第几块开始传,也就是currentPart
Future _uploadZip(String path) async {
File file = File(path);
String fileName = FileUtil.getBaseName(file.path);
int fileSize = file.lengthSync(); //文件总大小
int totalPart = (fileSize * 1.0 / partSize).ceil(); //分块总数 向上取整
int currentPart = currentPart; //当前要传第几块 由后台记录返回的
RandomAccessFile raf = file.openSync(mode: FileMode.read);
//开启循环上传每一块
while (currentPart
2.将每一个分块上传到后台,并记录上传是否成功
Future _uploadPart(File file, int currentPart, int totalPart, int fileSize, String fileName,RandomAccessFile raf) async {
//开始读文件的位置
int start = currentPart * partSize;
//读取文件的长度 注意不要让长度超过总长度
var length = (start + partSize > fileSize) ? (fileSize - start) : partSize;
raf.setPositionSync(start);
Uint8List data = raf.readSync(length);//从文件总长度中截取出要上传的长度
Map map = {};
map['total'] = totalPart; //总块数
map['currentPart'] = currentPart; //当前上传到第几块
map['part'] = MultipartFile.fromBytes(data, filename:'随便设置文件名');//当前快的数据
Map? response = await 真正的上传函数
//自定义逻辑 失败的话返回false
return true;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 【广州华锐互动】鱼类授精繁殖VR虚拟仿真实训系统
随着科技的不断发展,虚拟现实技术在各个领域的应用越来越广泛。在养殖业中,VR技服务器托管网术可以帮助养殖户进行家鱼授精实操演练,提高养殖效率和繁殖成功服务器托管网率。本文将介绍利用VR开展家鱼授精实操演练的方法和应用。 首先,我们需要了解家鱼授精的基本…