Select Git revision
caching_middleware.go
file.go 2.82 KiB
package files
import (
"bytes"
"fmt"
"io/fs"
"strings"
"text/template"
"git.perx.ru/perxis/perxis-go/id"
)
const (
TemporaryPrefix = "tmp"
)
// File - описание файла в системе хранения perxis
type File struct {
ID string `mapstructure:"id,omitempty" json:"id" expr:"id"` // Уникальный идентификатор файла в хранилище
Name string `mapstructure:"name,omitempty" json:"name" bson:"name,omitempty" expr:"name"` // Имя файла
Size uint64 `mapstructure:"size,omitempty" json:"size" bson:"size,omitempty" expr:"size"` // Размер файла
MimeType string `mapstructure:"mimeType,omitempty" json:"mimeType" bson:"mimeType,omitempty" expr:"mime_type"` // Mime-type файла
URL string `mapstructure:"url,omitempty" json:"url" bson:"url,omitempty" expr:"url"` // Адрес для загрузки файла
Key string `mapstructure:"key,omitempty" json:"key" bson:"key,omitempty" expr:"key"` // Ключ для хранения файла в хранилище
File fs.File `mapstructure:"-" json:"-" bson:"-"` // Файл для загрузки(из файловой системы)
}
func (f File) Clone() *File {
return &f
}
func (f File) Temporary() bool {
return strings.HasPrefix(f.ID, TemporaryPrefix)
}
func (f *File) SetURLWithTemplate(t *template.Template) error {
if t == nil {
return nil
}
res := new(bytes.Buffer)
if err := t.Execute(res, f); err != nil {
return err
}
f.URL = res.String()
return nil
}
func NewFile(name, mimeType string, size uint64, temp bool) *File {
i := id.GenerateNewID()
if temp {
i = fmt.Sprintf("%s%s", TemporaryPrefix, i)
}
return &File{
ID: i,
Name: name,
Size: size,
MimeType: mimeType,
}
}
// MultipartUpload - описание загрузки файла
type MultipartUpload struct {
File
UploadID string `json:"upload_id"` // Идентификатор загрузки хранилища
PartSize uint64 `json:"part_size"` // Размер блока для загрузки
PartURLs []string `json:"part_urls"` // Адреса для загрузки полного файла
Parts []*CompletedPart `json:"parts"` // Идентификаторы загруженных блоков (S3 ETAGs)
}