Beispiel #1
0
        private async Task UploadItem(UploadDetails details)
        {
            if (!await ShouldUpload(details))
            {
                return;
            }

            try
            {
                var filePath = FileManager.GetFilePath(_config, details.DataId);
                Console.WriteLine($"Uploading on {Environment.CurrentManagedThreadId}");
                var url = await UploadFileCore(GetId(details.DataId), filePath);

                Console.WriteLine($"Updating Realm on {Environment.CurrentManagedThreadId}");
                var success = await _runner.Execute((realm) =>
                {
                    using (var transaction = realm.BeginWrite())
                    {
                        var data = realm.Find <FileData>(details.DataId);

                        if (data == null)
                        {
                            transaction.Rollback();
                            return(false);
                        }

                        data.Url    = url;
                        data.Status = DataStatus.Remote;
                        transaction.Commit();

                        return(true);
                    }
                });

                if (success)
                {
                    OnFileUploaded?.Invoke(this, new FileUploadedEventArgs
                    {
                        FileDataId  = details.DataId,
                        FilePath    = filePath,
                        RealmConfig = _config,
                    });
                }
                else
                {
                    Logger.Error($"Could not find data with Id: {details.DataId}");
                    await DeleteFileCore(details.DataId);
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
                _ = Task.Delay(details.RetryAfter).ContinueWith(_ =>
                {
                    EnqueueUpload(details.DataId, Math.Min(details.RetryAfter * 2, MaxRetryDelay));
                });
            }
        }
Beispiel #2
0
        private static RemoteFileManager GetManager(RealmConfigurationBase config)
        {
            return(_remoteManagers.GetOrAdd(config.DatabasePath, (key) =>
            {
                var result = _remoteManagerFactory();
                result.Start(config);
                result.OnFileUploaded += (s, e) =>
                {
                    OnFileUploaded?.Invoke(s, e);
                };

                // TODO: trigger cleanup event with a list of files that can be deleted.

                return result;
            }));
        }
Beispiel #3
0
 public void UploadFile(FileData fileData) => OnFileUploaded?.Invoke(this, fileData);
Beispiel #4
0
        protected async Task <bool> Sync(string[] images, object sender)
        {
            try
            {
                foreach (var filePath in images)
                {
                    var isUploaded    = false;
                    var tags          = filePath.GetFileTags();
                    var fileNotExists = !DirectoryHelper.FileExists(Path.Combine(
                                                                        DirectoryHelper.UploadedImagesPath,
                                                                        filePath.GetFileName()));
                    var path = DirectoryHelper.FailedImagesPath;
                    if (fileNotExists)
                    {
                        path = DirectoryHelper.UploadedImagesPath;
                        try
                        {
                            var fileName = filePath.GetFileName();
                            if (tempFileName.Equals(fileName))
                            {
                                return(false);
                            }
                            tempFileName = fileName;
                            using (var img = Image.FromFile(filePath))
                            {
                                isUploaded = await Upload(ImageToByteArray(img), fileName, tags);
                            }
                        }
                        catch (Exception e)
                        {
                            LoggingHelper.Save(e);
                            isUploaded = false;
                        }
                    }

                    var done = fileNotExists && isUploaded;
                    if (done)
                    {
                        OnFileUploaded?.Invoke(sender, new ImageEventArgs
                        {
                            ImagePath  = filePath,
                            TargetPath = path
                        });
                    }
                    else
                    {
                        OnUploadFailed?.Invoke(sender, new ImageEventArgs
                        {
                            ImagePath  = filePath,
                            TargetPath = path
                        });
                    }
                    OnAllFilesUploaded?.Invoke(sender, EventArgs.Empty);
                }

                return(true);
            }
            catch (Exception ex)
            {
                LoggingHelper.Save(ex);
                return(false);
            }
        }