瀏覽代碼

Fetch a batch of URLs in one go

Vishnu Mohandas 4 年之前
父節點
當前提交
ccbc3bec96
共有 1 個文件被更改,包括 30 次插入12 次删除
  1. 30 12
      lib/utils/file_uploader.dart

+ 30 - 12
lib/utils/file_uploader.dart

@@ -20,6 +20,7 @@ class FileUploader {
   final _queue = LinkedHashMap<int, FileUploadItem>();
   final _queue = LinkedHashMap<int, FileUploadItem>();
   final _maximumConcurrentUploads = 4;
   final _maximumConcurrentUploads = 4;
   int _currentlyUploading = 0;
   int _currentlyUploading = 0;
+  final _uploadURLs = Queue<UploadURL>();
 
 
   FileUploader._privateConstructor();
   FileUploader._privateConstructor();
   static FileUploader instance = FileUploader._privateConstructor();
   static FileUploader instance = FileUploader._privateConstructor();
@@ -50,10 +51,6 @@ class FileUploader {
     });
     });
   }
   }
 
 
-  Future<File> getCurrentUploadStatus(File file) {
-    return _queue[file.generatedID]?.completer?.future;
-  }
-
   Future<File> forceUpload(File file, int collectionID) async {
   Future<File> forceUpload(File file, int collectionID) async {
     // If the file hasn't been queued yet, ez.
     // If the file hasn't been queued yet, ez.
     if (!_queue.containsKey(file.generatedID)) {
     if (!_queue.containsKey(file.generatedID)) {
@@ -215,14 +212,35 @@ class FileUploader {
     });
     });
   }
   }
 
 
-  Future<UploadURL> _getUploadURL() {
-    return Dio()
-        .get(
-          Configuration.instance.getHttpEndpoint() + "/files/upload-url",
-          options: Options(
-              headers: {"X-Auth-Token": Configuration.instance.getToken()}),
-        )
-        .then((response) => UploadURL.fromMap(response.data));
+  Future<UploadURL> _getUploadURL() async {
+    if (_uploadURLs.isEmpty) {
+      await _fetchUploadURLs();
+    }
+    return _uploadURLs.removeFirst();
+  }
+
+  Future<void> _uploadURLFetchInProgress;
+
+  Future<void> _fetchUploadURLs() {
+    if (_uploadURLFetchInProgress == null) {
+      _uploadURLFetchInProgress = Dio()
+          .get(
+        Configuration.instance.getHttpEndpoint() + "/files/upload-urls",
+        queryParameters: {
+          "count": 42, // m4gic number
+        },
+        options: Options(
+            headers: {"X-Auth-Token": Configuration.instance.getToken()}),
+      )
+          .then((response) {
+        _uploadURLFetchInProgress = null;
+        final urls = (response.data["urls"] as List)
+            .map((e) => UploadURL.fromMap(e))
+            .toList();
+        _uploadURLs.addAll(urls);
+      });
+    }
+    return _uploadURLFetchInProgress;
   }
   }
 
 
   Future<String> _putFile(UploadURL uploadURL, io.File file) async {
   Future<String> _putFile(UploadURL uploadURL, io.File file) async {