uploader

package
v0.2.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 22, 2025 License: MIT Imports: 14 Imported by: 1

Documentation

Overview

Package uploader manages media files uploaded to a server. The files are expected to belong to a parent database object, such as a slideshow, with the files being uploaded asynchronously from a form that modifies the parent. The parent need not exist at the time of upload, and an extended transaction model is used to maintain consistency between the database and the media files.

Deleted media files are retained for a specified period, allowing that they may still be referenced from cached web pages.

Uploader maintains consistency across server restarts between the parent object and the media files it references. Operation is intended to be robust for processing that may take a long time, such as converting a video file. To prevent overloading a modest server, on a server restart the workload for recovery is limited to that similar to normal operation.

Index

Constants

View Source
const (
	OpCancelType = 1
	OpDeleteType = 2
)

Operation types

Variables

View Source
var WebFiles embed.FS

WebFiles are the package's web resources (templates and static files)

Functions

func CleanName

func CleanName(name string) string

CleanName removes unwanted characters from a filename, to make it safe for display and storage. From https://stackoverflow.com/questions/54461423/efficient-way-to-remove-all-non-alphanumeric-characters-from-large-text. ## This is far more restrictive than we need.

func FileFromName

func FileFromName(id etx.TxId, version int, name string) string

FileFromName returns the stored file name for a newly uploaded file.

func NameFromFile

func NameFromFile(fileName string) string

NameFromFile returns the media file name from a file name.

func PermanentName

func PermanentName(tempName string, ext string) string

PermanentName returns a stored file name with the prefix for permanent status, and optionally a different extension.

func SmallName

func SmallName(name string, ext string) string

SmallName returns a file name with the prefix for a thumbnail or snapshot, and optionally a different extension.

Types

type Bind

type Bind struct {
	// contains filtered or unexported fields
}

Context for a sequence of bind calls.

func (*Bind) End

func (b *Bind) End() error

End completes the linking a parent object, and deletes any files for the transaction that are not required.

func (*Bind) File

func (b *Bind) File(fileName string) (string, error)

File is called to check if a file has changed. If so, it returns the new filename. An empty string indicates no change.

type Claim

type Claim struct {
	// contains filtered or unexported fields
}

Context for a sequence of claim calls and subsequent processing.

func (*Claim) End

func (c *Claim) End(fn Uploaded)

End requests notification when uploads are done. Any unclaimed temporary files are deleted.

func (*Claim) File

func (c *Claim) File(name string)

File specifies a file that is referenced by the client. It is legal to specify files from other transactions; these will be ignored.

type DB

type DB interface {
	Begin() func() // start transaction and return commit function
}

DB is an interface to the database manager that handles parent transactions.

type OpCancel

type OpCancel struct {
}

type OpDelete

type OpDelete struct {
	Name string
}

type ReqSave

type ReqSave struct {
	FilePath string
	Name     string // file name
	// contains filtered or unexported fields
}

func (*ReqSave) Done

func (req *ReqSave) Done()

Done is called when processing has been completed, after Save() returned false.

type UpMedia

type UpMedia interface {
	Save(req ReqSave) (bool, error) // save media file, returning true if saving completed.
	Thumbnail(string) string        // return thumbnail name corresponding to media file name.
}

UpMedia is an interface to a processor for a set of media formats.

Save() is called from the main worker thread. It may rename the temporary file to be permanent of perform a required conversion, save the result as a permanent file, and delete the temporary file. It returns true if conversion and saving has been performed synchronously. If conversion will be slow, such as for a video file, send the request to a separate worker thread, return false, and call ReqSave.Done when processing is complete.

Thumbnail identifies any associated file to be deleted with the main file.

type Uploaded

type Uploaded func(error)

Callback when all claimed files are ready for use.

type Uploader

type Uploader struct {

	// parameters
	DeleteAfter time.Duration // delay before deleting a file
	KeepNames   bool          // keep user's name for file in stored file name
	MaxAge      time.Duration // maximum time for a parent update

	// components
	ErrorLog *log.Logger
	// contains filtered or unexported fields
}

Uploader holds the parameters and state for uploading files. Typically only one is needed.

func NewUploader

func NewUploader(log *log.Logger, db DB, tm *etx.TM, filePath string) *Uploader

NewUploader starts and returns the file uploader. Public parameters may be changed before the first call to Begin().

func (*Uploader) AddTypes

func (up *Uploader) AddTypes(types []string, mediaCode int, upMedia UpMedia, chDone chan bool)

AddTypes adds a processor for a set of formats.

func (*Uploader) Begin

func (up *Uploader) Begin() (string, error)

Begin returns a transaction code for an update that may include a set of uploads. It expects that a database transaction (needed to write redo records) has been started.

func (*Uploader) Commit

func (up *Uploader) Commit(tx etx.TxId) error

Commit makes temporary uploaded files permanent. It returns false if the transaction ID for a set of uploads has expired.

func (*Uploader) Delete

func (up *Uploader) Delete(tx etx.TxId, filename string) error

Delete removes a media file and deletes it after a delay to allow for cached web pages holding references to be aged.

func (*Uploader) DeleteNow

func (up *Uploader) DeleteNow(filename string) error

DeleteNow removes a media file immediately, together with its thumbnail. Operation is idempotent. I.e. no error is returned if the file has already been deleted.

func (*Uploader) ForOperation

func (up *Uploader) ForOperation(opType int) etx.Op

func (*Uploader) MediaType

func (up *Uploader) MediaType(filename string) int

MediaType returns the media code of a file. It is 0 if not accepted.

func (*Uploader) Name

func (up *Uploader) Name() string

func (*Uploader) Operation

func (up *Uploader) Operation(id etx.TxId, opType int, op etx.Op)

Do operation requested via TM.

func (*Uploader) Save

func (up *Uploader) Save(fh *multipart.FileHeader, tx etx.TxId, version int) (error, bool)

Save creates a temporary copy of an uploaded file, to be processed later. With an error it returns true if it is the client's fault, false if it is the server's fault.

func (*Uploader) StartBind

func (up *Uploader) StartBind(tx etx.TxId) *Bind

StartBind initiates linking a parent object to a set of uploaded files, returning a context for calls to Bind and EndBind.

func (*Uploader) StartClaim

func (up *Uploader) StartClaim(tx etx.TxId) *Claim

StartClaim prepares for the client to identify the files it references.

func (*Uploader) Status

func (up *Uploader) Status(filename string) int

Working returns the processed status for an image. 0 = no file, 1 = processing, 100 = ready. Percent processed and errors may be implemented in future.

func (*Uploader) Stop

func (up *Uploader) Stop()

Stop shuts down the uploader.

func (*Uploader) Thumbnail

func (up *Uploader) Thumbnail(filename string) string

Thumbnail returns the prefixed name for a thumbnail.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL