diff --git a/internal/storage/FileServing.go b/internal/storage/FileServing.go index 104faec..e46c867 100644 --- a/internal/storage/FileServing.go +++ b/internal/storage/FileServing.go @@ -63,16 +63,23 @@ func NewFile(fileContent io.Reader, fileHeader *multipart.FileHeader, uploadRequ addHotlink(&file) filename := configuration.Get().DataDir + "/" + file.SHA256 dataDir := configuration.Get().DataDir + if file.AwsBucket != "" { - _, err := aws.Upload(reader, file) + exists, size, err := aws.FileExists(file) if err != nil { return models.File{}, err } + if !exists || (size == 0 && file.Size != "0 B") { + _, err = aws.Upload(reader, file) + if err != nil { + return models.File{}, err + } + } database.SaveMetaData(file) return file, nil } - fileWithHashExists := helper.FileExists(dataDir + "/" + file.SHA256) + fileWithHashExists := FileExists(file, configuration.Get().DataDir) if fileWithHashExists { encryptionLevel := configuration.Get().Encryption.Level previousEncryption, ok := getEncInfoFromExistingFile(file.SHA256) @@ -325,7 +332,7 @@ func getFileHandler(file models.File, dataDir string) (*os.File, int64) { // FileExists checks if the file exists locally or in S3 func FileExists(file models.File, dataDir string) bool { if file.AwsBucket != "" { - result, err := aws.FileExists(file) + result, _, err := aws.FileExists(file) if err != nil { fmt.Println("Warning, cannot check file " + file.Id + ": " + err.Error()) return true diff --git a/internal/storage/FileServing_test.go b/internal/storage/FileServing_test.go index 3b22c0c..fb7bea6 100644 --- a/internal/storage/FileServing_test.go +++ b/internal/storage/FileServing_test.go @@ -515,13 +515,15 @@ func TestDeleteFile(t *testing.T) { } database.SaveMetaData(awsFile) files = database.GetAllMetadata() - result, err := aws.FileExists(files["awsTest1234567890123"]) + result, size, err := aws.FileExists(files["awsTest1234567890123"]) test.IsEqualBool(t, result, true) + test.IsEqualBool(t, size != 0, true) test.IsNil(t, err) DeleteFile("awsTest1234567890123", true) time.Sleep(5 * time.Second) - result, err = aws.FileExists(awsFile) + result, size, err = aws.FileExists(awsFile) test.IsEqualBool(t, result, false) + test.IsEqualInt(t, int(size), 0) test.IsNil(t, err) testconfiguration.DisableS3() } diff --git a/internal/storage/cloudstorage/aws/AwsS3.go b/internal/storage/cloudstorage/aws/AwsS3.go index a070a3e..a03ad1f 100644 --- a/internal/storage/cloudstorage/aws/AwsS3.go +++ b/internal/storage/cloudstorage/aws/AwsS3.go @@ -67,7 +67,7 @@ func IsValidLogin(config models.AwsConfig) (bool, error) { } tempConfig := awsConfig awsConfig = config - _, err := FileExists(models.File{AwsBucket: awsConfig.Bucket, SHA256: "invalid"}) + _, _, err := FileExists(models.File{AwsBucket: awsConfig.Bucket, SHA256: "invalid"}) awsConfig = tempConfig if err != nil { return false, err @@ -145,11 +145,11 @@ func RedirectToDownload(w http.ResponseWriter, r *http.Request, file models.File } // FileExists returns true if the object is stored in S3 -func FileExists(file models.File) (bool, error) { +func FileExists(file models.File) (bool, int64, error) { sess := createSession() svc := s3.New(sess) - _, err := svc.HeadObject(&s3.HeadObjectInput{ + info, err := svc.HeadObject(&s3.HeadObjectInput{ Bucket: aws.String(file.AwsBucket), Key: aws.String(file.SHA256), }) @@ -158,12 +158,12 @@ func FileExists(file models.File) (bool, error) { aerr, ok := err.(awserr.Error) if ok { if aerr.Code() == "NotFound" { - return false, nil + return false, 0, nil } } - return false, err + return false, 0, err } - return true, nil + return true, *info.ContentLength, nil } // DeleteObject deletes a file from S3 diff --git a/internal/storage/cloudstorage/aws/AwsS3_mock.go b/internal/storage/cloudstorage/aws/AwsS3_mock.go index 671dfc7..f1a7598 100644 --- a/internal/storage/cloudstorage/aws/AwsS3_mock.go +++ b/internal/storage/cloudstorage/aws/AwsS3_mock.go @@ -142,12 +142,15 @@ func RedirectToDownload(w http.ResponseWriter, r *http.Request, file models.File } // FileExists returns true if the object is stored in S3 -func FileExists(file models.File) (bool, error) { +func FileExists(file models.File) (bool, int64, error) { if !isValidCredentials() { - return false, errors.New("invalid credentials / invalid bucket / invalid region") + return false, 0, errors.New("invalid credentials / invalid bucket / invalid region") + } + if !isUploaded(file) { + return false, 0, nil } - return isUploaded(file), nil + return true, 10000, nil } // DeleteObject deletes a file from S3 diff --git a/internal/storage/cloudstorage/aws/AwsS3_slim.go b/internal/storage/cloudstorage/aws/AwsS3_slim.go index 226c12b..0b851ed 100644 --- a/internal/storage/cloudstorage/aws/AwsS3_slim.go +++ b/internal/storage/cloudstorage/aws/AwsS3_slim.go @@ -58,8 +58,8 @@ func RedirectToDownload(w http.ResponseWriter, r *http.Request, file models.File } // FileExists returns true if the object is stored in S3 -func FileExists(file models.File) (bool, error) { - return true, errors.New(errorString) +func FileExists(file models.File) (bool, int64, error) { + return true, 0, errors.New(errorString) } // DeleteObject deletes a file from S3