sliproad/files/disk.go

119 lines
2.6 KiB
Go
Raw Permalink Normal View History

package files
import (
"fmt"
"io"
"io/ioutil"
"mime"
"net/http"
"os"
"path/filepath"
"strings"
)
type DiskProvider struct{
FileProvider
}
func (dp *DiskProvider) Setup(args map[string]string) bool {
return true
}
func (dp *DiskProvider) GetDirectory(path string) Directory {
rp := strings.Join([]string{dp.Location,path}, "/")
fileDir, err := ioutil.ReadDir(rp)
if err != nil {
_ = os.MkdirAll(path, 0644)
}
var fileList []FileInfo
for _, file := range fileDir {
info := FileInfo{
IsDirectory: file.IsDir(),
Name: file.Name(),
}
if !info.IsDirectory {
split := strings.Split(file.Name(), ".")
info.Extension = split[len(split) - 1]
}
fileList = append(fileList, info)
}
return Directory{
Path: rp,
Files: fileList,
}
}
func (dp *DiskProvider) SendFile(path string) (stream io.Reader, contenttype string, err error) {
rp := strings.Join([]string{dp.Location,path}, "/")
f, err := os.Open(rp)
if err != nil {
return stream, contenttype, err
}
contenttype = mime.TypeByExtension(filepath.Ext(rp))
if contenttype == "" {
var buf [512]byte
n, _ := io.ReadFull(f, buf[:])
contenttype = http.DetectContentType(buf[:n])
_, err := f.Seek(0, io.SeekStart)
if err != nil {
return stream, contenttype, err
}
}
return f, contenttype, nil
}
func (dp *DiskProvider) SaveFile(file io.Reader, filename string, path string) bool {
rp := strings.Join([]string{dp.Location,path,filename}, "/")
f, err := os.OpenFile(rp, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
fmt.Printf("error creating %v: %v\n", rp, err.Error())
return false
}
defer f.Close()
_, err = io.Copy(f, file)
if err != nil {
fmt.Printf("error writing %v: %v\n", rp, err.Error())
return false
}
return true
}
func (dp *DiskProvider) ObjectInfo(path string) (bool, bool, string) {
rp := strings.Join([]string{dp.Location,path}, "/")
fileStat, err := os.Stat(rp)
if err != nil {
fmt.Printf("error gather stats for file %v: %v", rp, err.Error())
return false, false, FileIsLocal
}
if fileStat.IsDir() {
return true, true, FileIsLocal
}
return true, false, FileIsLocal
}
func (dp *DiskProvider) CreateDirectory(path string) bool {
rp := strings.Join([]string{dp.Location,path}, "/")
err := os.Mkdir(rp, 0755)
if err != nil {
fmt.Printf("Error creating directory %v: %v\n", rp, err.Error())
return false
}
return true
}
func (dp *DiskProvider) Delete(path string) bool {
rp := strings.Join([]string{dp.Location,path}, "/")
err := os.RemoveAll(rp)
if err != nil {
fmt.Printf("Error removing %v: %v\n", path, err.Error())
return false
}
return true
}