64 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| 
								 | 
							
								package fs
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"errors"
							 | 
						||
| 
								 | 
							
									"io"
							 | 
						||
| 
								 | 
							
									"mime/multipart"
							 | 
						||
| 
								 | 
							
									"os"
							 | 
						||
| 
								 | 
							
									"path"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/google/uuid"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"dev.sum7.eu/genofire/golang-lib/web/file"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// consts for filemanager
							 | 
						||
| 
								 | 
							
								const (
							 | 
						||
| 
								 | 
							
									StorageTypeFS = "fs"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// error messages
							 | 
						||
| 
								 | 
							
								var (
							 | 
						||
| 
								 | 
							
									ErrPathNotExistsOrNoDirectory = errors.New("path invalid: not exists or not an directory")
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// FileManager to handle data on disk
							 | 
						||
| 
								 | 
							
								type FileManager struct {
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Check if filemanager could be used
							 | 
						||
| 
								 | 
							
								func (m *FileManager) Check(s *file.Service) error {
							 | 
						||
| 
								 | 
							
									info, err := os.Stat(s.Path)
							 | 
						||
| 
								 | 
							
									if os.IsNotExist(err) || !info.IsDir() {
							 | 
						||
| 
								 | 
							
										return ErrPathNotExistsOrNoDirectory
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Save a file on disk and update file db
							 | 
						||
| 
								 | 
							
								func (m *FileManager) Save(s *file.Service, file *file.File, src multipart.File) error {
							 | 
						||
| 
								 | 
							
									file.ID = uuid.New()
							 | 
						||
| 
								 | 
							
									file.Path = path.Join(file.ID.String(), file.Filename)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									directory := path.Join(s.Path, file.ID.String())
							 | 
						||
| 
								 | 
							
									os.Mkdir(directory, 0750)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									out, err := os.Create(path.Join(s.Path, file.Path))
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									defer out.Close()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_, err = io.Copy(out, src)
							 | 
						||
| 
								 | 
							
									return err
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Read get an reader of an file
							 | 
						||
| 
								 | 
							
								func (m *FileManager) Read(s *file.Service, file *file.File) (io.Reader, error) {
							 | 
						||
| 
								 | 
							
									return os.Open(path.Join(s.Path, file.Path))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func init() {
							 | 
						||
| 
								 | 
							
									file.AddManager(StorageTypeFS, &FileManager{})
							 | 
						||
| 
								 | 
							
								}
							 |