aboutsummaryrefslogtreecommitdiff
path: root/weed/util
diff options
context:
space:
mode:
Diffstat (limited to 'weed/util')
-rw-r--r--weed/util/file_util.go21
-rw-r--r--weed/util/file_util_test.go22
2 files changed, 41 insertions, 2 deletions
diff --git a/weed/util/file_util.go b/weed/util/file_util.go
index 346de76db..430b6bc86 100644
--- a/weed/util/file_util.go
+++ b/weed/util/file_util.go
@@ -1,16 +1,20 @@
package util
import (
+ "bytes"
+ "crypto/sha256"
"errors"
+ "fmt"
+ "github.com/seaweedfs/seaweedfs/weed/glog"
"os"
"os/user"
"path/filepath"
"strings"
"time"
-
- "github.com/seaweedfs/seaweedfs/weed/glog"
)
+const maxFilenameLength = 255
+
func TestFolderWritable(folder string) (err error) {
fileInfo, err := os.Stat(folder)
if err != nil {
@@ -106,6 +110,19 @@ func FileNameBase(filename string) string {
return filename[:lastDotIndex]
}
+func ToShortFileName(path string) string {
+ fileName := filepath.Base(path)
+ if fileNameBytes := []byte(fileName); len(fileNameBytes) > maxFilenameLength {
+ shaStr := fmt.Sprintf("%x", sha256.Sum256(fileNameBytes))
+ fileNameBase := FileNameBase(fileName)
+ fileExt := fileName[len(fileNameBase):]
+ fileNameBaseBates := bytes.ToValidUTF8([]byte(fileNameBase)[:maxFilenameLength-len([]byte(fileExt))-8], []byte{})
+ shortFileName := string(fileNameBaseBates) + shaStr[len(shaStr)-8:]
+ return filepath.Join(filepath.Dir(path), shortFileName) + fileExt
+ }
+ return path
+}
+
// Copied from os.WriteFile(), adding file sync.
// see https://github.com/golang/go/issues/20599
func WriteFile(name string, data []byte, perm os.FileMode) error {
diff --git a/weed/util/file_util_test.go b/weed/util/file_util_test.go
new file mode 100644
index 000000000..a1f924fed
--- /dev/null
+++ b/weed/util/file_util_test.go
@@ -0,0 +1,22 @@
+package util
+
+import (
+ "testing"
+)
+
+func TestToShortFileName(t *testing.T) {
+ tests := []struct {
+ in string
+ value string
+ }{
+ {"/data/a/b/c/d.txt", "/data/a/b/c/d.txt"},
+ {"/data/a/b/c/очень_длинное_имя_файла_c_подробным_указанием_наименования_и_содержания_стандартизованных_форм_за_анварь_-_июнь_2023_года(РОГА_И_КОПЫТА_ООО).txt", "/data/a/b/c/очень_длинное_имя_файла_c_подробным_указанием_наименования_и_содержания_стандартизованных_форм_за_анварь_-_июнь_2023_года(РОГА_И_КОПЫТ354fcaf4.txt"},
+ {"/data/a/b/c/очень_длинное_имя_файла_c_подробным_указанием_наименования_и_содержания_стандартизованных_форм_за_анварь_-_июнь_2023_года(РОГА_И_КОПЫТА_ООО)_without_extension", "/data/a/b/c/очень_длинное_имя_файла_c_подробным_указанием_наименования_и_содержания_стандартизованных_форм_за_анварь_-_июнь_2023_года(РОГА_И_КОПЫТА_О21a6e47a"},
+ }
+ for _, p := range tests {
+ got := ToShortFileName(p.in)
+ if got != p.value {
+ t.Errorf("failed to test: got %v, want %v", got, p.value)
+ }
+ }
+}