Don't upload to AWS if file already exists

This commit is contained in:
Marc Ole Bulling
2022-05-01 11:46:48 +02:00
parent abc214e8b6
commit 8c094a1d48
5 changed files with 28 additions and 16 deletions
+10 -3
View File
@@ -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
+4 -2
View File
@@ -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()
}
+6 -6
View File
@@ -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
@@ -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
@@ -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