最近一直在搞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<Digest>();
var input = md5.startChunkedConversion(output);//这是一个sink 会把所有块的md5拼接到一起
3.第三部循环所有分快
int currentPart = 0;
while (currentPart < totalPart) {
//文件开始读取的位置
start = currentPart * partSize;
//读取的长度 最后一块直接到文件长度
length = (start + partSize > 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();
int totalPart = (fileSize * 1.0 / partSize).ceil();
int start; //开始读文件的位置
int length; //读取文件的长度
var output = convert.AccumulatorSink<Digest>();
var input = md5.startChunkedConversion(output);
int currentPart = 0;
while (currentPart < totalPart) {
start = currentPart * partSize;
length = (start + partSize > 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;
}
欢迎各位指正,希望可以帮助用flutter开发的兄弟们~~