Browse Source

[mob][multipart] Fix multipart flow for fileUpdate

Neeraj Gupta 1 năm trước cách đây
mục cha
commit
0db4842d81
1 tập tin đã thay đổi với 24 bổ sung8 xóa
  1. 24 8
      mobile/lib/utils/file_uploader.dart

+ 24 - 8
mobile/lib/utils/file_uploader.dart

@@ -1,7 +1,6 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:convert';
-import "dart:developer" as dev;
 import 'dart:io';
 import 'dart:math' as math;
 
@@ -419,7 +418,7 @@ class FileUploader {
           (fileOnDisk.updationTime ?? -1) != -1 &&
           (fileOnDisk.collectionID ?? -1) == collectionID;
       if (wasAlreadyUploaded) {
-        debugPrint("File is already uploaded ${fileOnDisk.tag}");
+        _logger.info("File is already uploaded ${fileOnDisk.tag}");
         return fileOnDisk;
       }
     }
@@ -488,18 +487,33 @@ class FileUploader {
       );
 
       Uint8List? key;
-      EncryptionResult? multipartEncryptionResult;
+      EncryptionResult? multiPartFileEncResult;
       if (isUpdatedFile) {
         key = getFileKey(file);
+        multiPartFileEncResult = multipartEntryExists
+            ? await _multiPartUploader.getEncryptionResult(
+                lockKey,
+                mediaUploadData.hashData!.fileHash!,
+                collectionID,
+              )
+            : null;
+        if (multiPartFileEncResult?.key != null &&
+            !listEquals(key, multiPartFileEncResult!.key)) {
+          _logger
+              .severe("Key mismatch for existing multipart entry, reuploading");
+          await _uploadLocks.deleteMultipartTrack(lockKey);
+          multipartEntryExists = false;
+          multiPartFileEncResult = null;
+        }
       } else {
-        multipartEncryptionResult = multipartEntryExists
+        multiPartFileEncResult = multipartEntryExists
             ? await _multiPartUploader.getEncryptionResult(
                 lockKey,
                 mediaUploadData.hashData!.fileHash!,
                 collectionID,
               )
             : null;
-        key = multipartEncryptionResult?.key;
+        key = multiPartFileEncResult?.key;
 
         // check if the file is already uploaded and can be mapped to existing
         // uploaded file. If map is found, it also returns the corresponding
@@ -529,7 +543,7 @@ class FileUploader {
               .warning('encrypted file not found for multipart upload entry');
           await _uploadLocks.deleteMultipartTrack(lockKey);
           multipartEntryExists = false;
-          multipartEncryptionResult = null;
+          multiPartFileEncResult = null;
         }
       } else if (encryptedFileExists) {
         // otherwise just delete the file for singlepart upload
@@ -538,7 +552,7 @@ class FileUploader {
       await _checkIfWithinStorageLimit(mediaUploadData.sourceFile!);
       final encryptedFile = File(encryptedFilePath);
 
-      final EncryptionResult fileAttributes = multipartEncryptionResult ??
+      final EncryptionResult fileAttributes = multiPartFileEncResult ??
           await CryptoUtil.encryptFile(
             mediaUploadData.sourceFile!.path,
             encryptedFilePath,
@@ -581,7 +595,9 @@ class FileUploader {
         fileObjectKey = await _putFile(fileUploadURL, encryptedFile);
       } else {
         _isMultipartUpload = true;
-        dev.log("Init multipartUpload $multipartEntryExists", name: "Uploader");
+        _logger.finest(
+          "Init multipartUpload $multipartEntryExists, isUpdate $isUpdatedFile",
+        );
         if (multipartEntryExists) {
           fileObjectKey = await _multiPartUploader.putExistingMultipartFile(
             encryptedFile,