From 1284ae5a4a5458e76d7dc1723e1e689dad01be27 Mon Sep 17 00:00:00 2001 From: Chakib Benziane Date: Thu, 21 Mar 2019 18:56:35 +0100 Subject: [PATCH] skip write for already stored files --- .gitignore | 1 + storage/storage.go | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 464857c..80a8b9e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ bit4sat db-storage +file-storage diff --git a/storage/storage.go b/storage/storage.go index c5bb3a8..fd8eb81 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -1,6 +1,8 @@ package storage import ( + "errors" + "fmt" "io" "log" "mime/multipart" @@ -24,7 +26,18 @@ func GetStoreDestination(filename string) string { } func StoreFormFile(src multipart.File, filename string) error { - fd, err := os.Create(GetStoreDestination(filename)) + filePath := GetStoreDestination(filename) + // If file exists just return + exists, err := CheckFileExists(filePath) + if err != nil { + return err + } + if exists { + log.Printf("file %s exists, skipping write", filename) + return nil + } + + fd, err := os.Create(filePath) defer fd.Close() if err != nil { return err @@ -36,6 +49,24 @@ func StoreFormFile(src multipart.File, filename string) error { return err } +func CheckFileExists(file string) (bool, error) { + info, err := os.Stat(file) + if err == nil { + if info.IsDir() { + errMsg := fmt.Sprintf("'%s' is a directory", file) + return false, errors.New(errMsg) + } + + return true, nil + } + + if os.IsNotExist(err) { + return false, nil + } + + return false, err +} + func init() { path, set := os.LookupEnv(StoragePathEnv) if !set {