upload

package
v1.0.0 Latest Latest
Warning

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

Go to latest
Published: Mar 3, 2020 License: Apache-2.0 Imports: 17 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type FailedFiles

type FailedFiles map[string]error

FiledFiles 上传失败的文件集合

type FileGroup

type FileGroup map[string][]*multipart.FileHeader

func (FileGroup) Each

func (slf FileGroup) Each(groupName string, hook func(i int, fileHeader *multipart.FileHeader))

Each 遍历所有groupName组下的成员反馈到hook中

func (FileGroup) EachAll

func (slf FileGroup) EachAll(
	hook func(groupName string, groupIndex int, fileHeader *multipart.FileHeader) error,
	failHook func(groupName string, groupIndex int, fileName string, fileSize int64, err error) bool) error

EachAll 遍历所有的FileHeader反馈到hook中

当hook返回的err为value存在多个的时候的时候,整个遍历将终止。 当hook返回的err为其他如文件创建失败等错误的时候,会进入下一个循环,并且将信息传入failHook中。 当failHook返回true,则表示直接终止遍历

func (FileGroup) Exist

func (slf FileGroup) Exist(groupName string) bool

Exist 检查groupName这个组是否存在

func (FileGroup) GroupLen

func (slf FileGroup) GroupLen(groupName string) int

GroupLen 返回groupName组的成员数量

type FileMeta

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

FileMeta 存储了上传文件信息的文件元信息

func NewFileMeta

func NewFileMeta(name string, size int64) *FileMeta

NewFileMeta 创建一个已经准备就绪的文件元信息

func (*FileMeta) GetExt

func (slf *FileMeta) GetExt() string

GetExt 返回文件的拓展名

func (*FileMeta) GetHash

func (slf *FileMeta) GetHash() string

GetHash 返回文件的hash

func (*FileMeta) GetId

func (slf *FileMeta) GetId() string

GetId 返回文件的id值

func (*FileMeta) GetName

func (slf *FileMeta) GetName() string

GetName 返回文件的名称

func (*FileMeta) GetNode

func (slf *FileMeta) GetNode() cloud.Node

GetNode 返回文件所在节点信息

func (*FileMeta) GetSize

func (slf *FileMeta) GetSize() int64

GetSize 返回文件的大小

func (*FileMeta) GetStorageName

func (slf *FileMeta) GetStorageName() string

GetStorageName 返回该文件在文件系统中的名称

func (*FileMeta) GetUploadAt

func (slf *FileMeta) GetUploadAt() time.Time

GetUploadAt 返回文件的上传时间

func (*FileMeta) IsFastUpload

func (slf *FileMeta) IsFastUpload() bool

IsFastUpload 检查文件元信息是否为快速上传产生的

type FileUploadReceiver

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

FileUploadReceiver 接收上传文件的文件上传接收器

这个文件上传接收器所接收到的所有文件都会以UUID的形式进行存储。 所有的文件都均存储在storageDir这个目录下。 在使用时候应当尽量保持维持FileUploadReceiver单例。

func New

func New(storageDir ...string) (*FileUploadReceiver, error)

New 创建一个FileUploadReceiver

入参可以为一个storageDir,表示所有接收到的文件都将存储到这个目录下。 存储文件需要依赖于节点信息,应该在main包的init函数下调用“application.Initialize()”函数进行应用程序初始化。

func (*FileUploadReceiver) Dispose

func (slf *FileUploadReceiver) Dispose(request *http.Request) ([]*FileMeta, FailedFiles, error)

Dispose 处理文件上传请求,并返回处理结果

在FileUploadReceiver中允许进行各种形式的文件上传,具体如下: 1、单文件普通上传; 2、单文件快速上传; 3、多文件普通上传; 4、多文件快速上传; 5、多文件普通快速混合上传。

FileUploadReceiver在处理请求时候会有几种情况: 情况1:当获取到的valueGroup不包含任何成员的时候,表明为普通的文件上传; 情况2:当获取到的fileGroup和valueGroup包含1个成员的时候,表明为快速上传,即秒传。

  • 同时,在满足情况2和已经设置过SetCompletenessCheckHandler的情况下,会对文件的完整性进行检查

情况3:当获取到的fileGroup和valueGroup的成员数不是1:1的时候,会返回error。

秒传情况下的请求中,保证每个文件的name属性和表示其hash的POST参数name属性相同。

应该保证如下方这样的form结构。 <form enctype="multipart/form-data" action="_URL_" method=POST>

<input name="file1" type="file">
<input name="file1" type="hidden" value="file1-hash">
<input name="file2" type="file">
<input name="file2" type="hidden" value="file2-hash">

</form>

func (*FileUploadReceiver) DisposePart

func (slf *FileUploadReceiver) DisposePart(request *http.Request) (string, error)

DisposePart 处理文件块上传请求,并返回任务组的partGroupId和错误信息

分块上传依赖于pratProcessor,在即将开始一个分块上传任务之前,应当调用FileUploadReceiver.NewPartTask来创建一个分块任务。 分块上传应当为多次请求来进行每个块的上传,比如三个块则发起三次请求。 不用担心会因为多次请求而造成每个块分散开来,FileUploadReceiver.NewPartTask正是为他们之间建立了关系。 在分块上传中,每个请求仅允许存在一个文件和一个文本,而且文本的格式必须符合“hash(string);sort(int)”。 分块上传的每一块文件上传均支持快速上传的特性,客户端无需做特殊处理,服务端仅需要使用过FileUploadReceiver.SetFastUploadHandler即可。

为了避免内存泄漏,在每一块文件大小超过一个特定的阈值的时候,则这个分块文件会被保存在本地。 当一个文件的分块即存在大于这个阈值和小于这个阈值的情况,他们会分散在内存和磁盘中,最后会进行合并。 如果需要调整这个值,可以使用FileUploadReceiver.SetPartUploadBufferSize函数来进行配置

func (*FileUploadReceiver) DisposePartMerge

func (slf *FileUploadReceiver) DisposePartMerge(partGroupId string, fileName string) (*FileMeta, error)

DisposePartMerge 合并分块上传的文件,返回FileMeta

在合并的时候partProcessor会对这个partGroupId(即文件hash)进行检查。 当所有分块没有完全上传完毕的时候,则会返回一个error,里面会补充一些提示和进度信息。

func (FileUploadReceiver) GetPartUploadSuccess

func (slf FileUploadReceiver) GetPartUploadSuccess(hash string) []int

GetPartUploadSuccess 返回特定hash的分块上传任务已上传的分块序号

func (FileUploadReceiver) IsFinish

func (slf FileUploadReceiver) IsFinish(hash string) bool

IsFinish 检查指定hash的任务是否已经完成

func (FileUploadReceiver) NewPartTask

func (slf FileUploadReceiver) NewPartTask(hash string, partNumber int)

NewPartTask 创建一个分块上传任务

由于分块上传是由多个文件组成一个文件,所以hash表示了他们共同指向的文件hash。 而具体的分片数量则由partNumber决定。

func (*FileUploadReceiver) SetCompletenessCheckHandler

func (slf *FileUploadReceiver) SetCompletenessCheckHandler(handler func(data []byte) string)

SetCompletenessCheckHandler 设置完整性检查处理函数

完整性检查用于检查文件是否在上传过程中被篡改。 在FileUploadReceiver接收到上传文件的时候会将文件数据传入这个函数来计算得到一个hash,用于和客户端携带的文件hash比较。 在设置了这个处理函数的时候,且满足快速上传的情况下,会自动启用完整性检查。 使用完整性检查的情况下,所消耗的内存会因为要将文件内容存储下来而变为文件大小 + readMaxMemory的值,效率也会有所降低。

func (*FileUploadReceiver) SetFailureAllowed

func (slf *FileUploadReceiver) SetFailureAllowed(allowOr bool)

SetFailureAllowed 设置是否不允许存在文件上传失败的情况

如果为true,那么当有一个文件上传失败,则所有文件均视为失败

func (*FileUploadReceiver) SetFastUploadHandler

func (slf *FileUploadReceiver) SetFastUploadHandler(handler func(hash string) *FileMeta)

SetFastUploadHandler 设置快速上传查询处理函数

这个函数用于检查文件是否已上传,具体实现可自行设置。 当返回的FileMeta不为空的时候,视为已上传,则进行快速上传操作。

func (*FileUploadReceiver) SetPartUploadBufferSize

func (slf *FileUploadReceiver) SetPartUploadBufferSize(partUploadBufferSize int64)

SetPartUploadBufferSize 设置分块上传每个块的缓冲区大小

为了避免全部存储在内存中导致内存溢出,在超出这个值后,将存储在临时文件中最后再进行合并。

func (*FileUploadReceiver) SetReadMaxMemory

func (slf *FileUploadReceiver) SetReadMaxMemory(maxMemory int64)

SetReadMaxMemory 设置ReadForm最大的内存数量

默认golang会预留10MB的内存供给非文件的数据。 当所读取的内容大小超出了这个值,则会缓存在临时文件中,效率将会降低。

func (*FileUploadReceiver) SetSaveFileBufferSize

func (slf *FileUploadReceiver) SetSaveFileBufferSize(size int64)

SetSaveFileBufferSize 设置每次读取文件缓冲区大小

当文件大小大于这个值的时候,会分为多次进行读取。 当文件大小小于这个值的时候,会一次性进行读取。 当这个值过大的情况下会导致一次性申请的内存过多,造成内存浪费。

type ValueGroup

type ValueGroup map[string][]string

func (ValueGroup) Each

func (slf ValueGroup) Each(groupName string, hook func(i int, value string))

Each 遍历所有groupName组下的成员反馈到hook中

func (ValueGroup) Exist

func (slf ValueGroup) Exist(groupName string) bool

Exist 检查groupName这个组是否存在

func (ValueGroup) GroupLen

func (slf ValueGroup) GroupLen(groupName string) int

GroupLen 返回groupName组的成员数量

Jump to

Keyboard shortcuts

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