mirror of
https://github.com/Forceu/Gokapi.git
synced 2026-05-12 09:29:50 -05:00
Don't upload to AWS if file already exists
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user