美文网首页
Flutter获取大文件MD5值的方法

Flutter获取大文件MD5值的方法

作者: 没有小叮当的大雄 | 来源:发表于2023-07-19 19:06 被阅读0次

    最近一直在搞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开发的兄弟们~~

    相关文章

      网友评论

          本文标题:Flutter获取大文件MD5值的方法

          本文链接:https://www.haomeiwen.com/subject/tzhaudtx.html