Browse Source

Improved upload chunk

marinofaggiana 3 years ago
parent
commit
29a684b8cd

+ 1 - 0
iOSClient/Data/NCDatabase.swift

@@ -183,6 +183,7 @@ class tableChunk: Object {
     @objc dynamic var fileName = ""
     @objc dynamic var fileName = ""
     @objc dynamic var index = ""
     @objc dynamic var index = ""
     @objc dynamic var ocId = ""
     @objc dynamic var ocId = ""
+    @objc dynamic var totalBytes: Int64 = 0
 
 
     override static func primaryKey() -> String {
     override static func primaryKey() -> String {
         return "index"
         return "index"

+ 15 - 1
iOSClient/Data/NCManageDatabase.swift

@@ -1036,6 +1036,7 @@ class NCManageDatabase: NSObject {
     func addChunks(account: String, ocId: String, chunkFolder: String, fileNames: [String]) {
     func addChunks(account: String, ocId: String, chunkFolder: String, fileNames: [String]) {
         
         
         let realm = try! Realm()
         let realm = try! Realm()
+        var size: Int64 = 0
         
         
         do {
         do {
             try realm.safeWrite {
             try realm.safeWrite {
@@ -1043,13 +1044,15 @@ class NCManageDatabase: NSObject {
                 for fileName in fileNames {
                 for fileName in fileNames {
                     
                     
                     let object = tableChunk()
                     let object = tableChunk()
+                    size = size + NCUtilityFileSystem.shared.getFileSize(filePath: CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)!)
                     
                     
                     object.account = account
                     object.account = account
                     object.chunkFolder = chunkFolder
                     object.chunkFolder = chunkFolder
                     object.fileName = fileName
                     object.fileName = fileName
                     object.index = ocId + fileName
                     object.index = ocId + fileName
                     object.ocId = ocId
                     object.ocId = ocId
-
+                    object.totalBytes = size
+                                        
                     realm.add(object, update: .all)
                     realm.add(object, update: .all)
                 }
                 }
             }
             }
@@ -1058,6 +1061,17 @@ class NCManageDatabase: NSObject {
         }
         }
     }
     }
     
     
+    func getChunk(account: String, fileName: String) -> tableChunk? {
+        
+        let realm = try! Realm()
+
+        if let result = realm.objects(tableChunk.self).filter("account == %@ AND fileName == %@", account, fileName).first {
+            return tableChunk.init(value: result)
+        } else {
+            return nil
+        }
+    }
+    
     func deleteChunk(account: String, ocId: String, fileName: String) {
     func deleteChunk(account: String, ocId: String, fileName: String) {
         
         
         let realm = try! Realm()
         let realm = try! Realm()

+ 1 - 1
iOSClient/NCGlobal.swift

@@ -79,7 +79,7 @@ class NCGlobal: NSObject {
     // Database Realm
     // Database Realm
     //
     //
     let databaseDefault                             = "nextcloud.realm"
     let databaseDefault                             = "nextcloud.realm"
-    let databaseSchemaVersion: UInt64               = 183
+    let databaseSchemaVersion: UInt64               = 184
     
     
     // Intro selector
     // Intro selector
     //
     //

+ 15 - 18
iOSClient/Networking/NCNetworkingChunkedUpload.swift

@@ -71,37 +71,34 @@ extension NCNetworking {
                 DispatchQueue.global(qos: .background).async {
                 DispatchQueue.global(qos: .background).async {
                         
                         
                     for fileName in filesNames {
                     for fileName in filesNames {
-                                                
-                        let counterString = (fileName as NSString).pathExtension
-                        let counter = Int64(counterString) ?? 0
+                            
                         let serverUrlFileName = chunkFolderPath + "/" + fileName
                         let serverUrlFileName = chunkFolderPath + "/" + fileName
                         let fileNameChunkLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: fileName)!
                         let fileNameChunkLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: fileName)!
-                        let chunkSize = NCUtilityFileSystem.shared.getFileSize(filePath: fileNameChunkLocalPath)
                         
                         
+                        var totalBytes: Int64?
+                        if let tableChunk = NCManageDatabase.shared.getChunk(account: metadata.account, fileName: fileName) {
+                            totalBytes = tableChunk.totalBytes - NCUtilityFileSystem.shared.getFileSize(filePath: fileNameChunkLocalPath)
+                        }
+                                                
                         let semaphore = Semaphore()
                         let semaphore = Semaphore()
                                                     
                                                     
                         NCCommunication.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameChunkLocalPath, requestHandler: { (request) in
                         NCCommunication.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameChunkLocalPath, requestHandler: { (request) in
                                 
                                 
                             self.uploadRequest[fileNameLocalPath] = request
                             self.uploadRequest[fileNameLocalPath] = request
                             
                             
-                            let chunksremains = NCManageDatabase.shared.getChunks(account: metadata.account, ocId: metadata.ocId).count
-                            let totalBytes = (counter + 1) * chunkSize
-                            let totalBytesExpected: Int64 = metadata.size
-                            var progress: Float = 0
-
-                            if chunksremains == 1 {
-                                progress = 1
-                            } else {
-                                progress = Float(totalBytes) / Float(totalBytesExpected)
-                            }
-                            
-                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterProgressTask, userInfo: ["account":metadata.account, "ocId":metadata.ocId, "fileName":metadata.fileName, "serverUrl":metadata.serverUrl, "status":NSNumber(value: NCGlobal.shared.metadataStatusInUpload), "progress":NSNumber(value: progress), "totalBytes":NSNumber(value: totalBytes), "totalBytesExpected":NSNumber(value: totalBytesExpected)])
-                            
                         }, taskHandler: { (task) in
                         }, taskHandler: { (task) in
                             
                             
                             NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, sessionError: "", sessionTaskIdentifier: task.taskIdentifier, status: NCGlobal.shared.metadataStatusUploading)
                             NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, sessionError: "", sessionTaskIdentifier: task.taskIdentifier, status: NCGlobal.shared.metadataStatusUploading)
                            
                            
-                        }, progressHandler: { (_) in
+                        }, progressHandler: { (progress) in
+                            
+                            if let totalBytes = totalBytes {
+                                let totalBytesExpected = totalBytes + progress.completedUnitCount
+                                let totalBytes = metadata.size
+                                let fractionCompleted = Float(totalBytesExpected) / Float(totalBytes)
+                                    
+                                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterProgressTask, object: nil, userInfo: ["account":metadata.account, "ocId":metadata.ocId, "fileName":metadata.fileName, "serverUrl":metadata.serverUrl, "status":NSNumber(value: NCGlobal.shared.metadataStatusInUpload), "progress":NSNumber(value: fractionCompleted), "totalBytes":NSNumber(value: totalBytes), "totalBytesExpected":NSNumber(value: totalBytesExpected)])
+                            }
                             
                             
                         }) { (_, _, _, _, _, _, _, errorCode, errorDescription) in
                         }) { (_, _, _, _, _, _, _, errorCode, errorDescription) in