Documentation ¶
Index ¶
- type FailedFiles
- type FileGroup
- type FileMeta
- func (slf *FileMeta) GetExt() string
- func (slf *FileMeta) GetHash() string
- func (slf *FileMeta) GetId() string
- func (slf *FileMeta) GetName() string
- func (slf *FileMeta) GetNode() cloud.Node
- func (slf *FileMeta) GetSize() int64
- func (slf *FileMeta) GetStorageName() string
- func (slf *FileMeta) GetUploadAt() time.Time
- func (slf *FileMeta) IsFastUpload() bool
- type FileUploadReceiver
- func (slf *FileUploadReceiver) Dispose(request *http.Request) ([]*FileMeta, FailedFiles, error)
- func (slf *FileUploadReceiver) DisposePart(request *http.Request) (string, error)
- func (slf *FileUploadReceiver) DisposePartMerge(partGroupId string, fileName string) (*FileMeta, error)
- func (slf FileUploadReceiver) GetPartUploadSuccess(hash string) []int
- func (slf FileUploadReceiver) IsFinish(hash string) bool
- func (slf FileUploadReceiver) NewPartTask(hash string, partNumber int)
- func (slf *FileUploadReceiver) SetCompletenessCheckHandler(handler func(data []byte) string)
- func (slf *FileUploadReceiver) SetFailureAllowed(allowOr bool)
- func (slf *FileUploadReceiver) SetFastUploadHandler(handler func(hash string) *FileMeta)
- func (slf *FileUploadReceiver) SetPartUploadBufferSize(partUploadBufferSize int64)
- func (slf *FileUploadReceiver) SetReadMaxMemory(maxMemory int64)
- func (slf *FileUploadReceiver) SetSaveFileBufferSize(size int64)
- type ValueGroup
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
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,则表示直接终止遍历
type FileMeta ¶
type FileMeta struct {
// contains filtered or unexported fields
}
FileMeta 存储了上传文件信息的文件元信息
func (*FileMeta) GetStorageName ¶
GetStorageName 返回该文件在文件系统中的名称
func (*FileMeta) IsFastUpload ¶
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 ¶
GetPartUploadSuccess 返回特定hash的分块上传任务已上传的分块序号
func (FileUploadReceiver) NewPartTask ¶
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 ¶
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组的成员数量