56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
|
|
package video
|
||
|
|
|
||
|
|
const ChunkSize = 5 << 20 // 5 MB
|
||
|
|
|
||
|
|
type ChunkUploadSession struct {
|
||
|
|
UploadID string `json:"upload_id"`
|
||
|
|
AccountID uint `json:"account_id"`
|
||
|
|
Filename string `json:"filename"`
|
||
|
|
FileSize int64 `json:"file_size"`
|
||
|
|
ChunkSize int64 `json:"chunk_size"`
|
||
|
|
TotalChunks int `json:"total_chunks"`
|
||
|
|
FileHash string `json:"file_hash"`
|
||
|
|
UploadedBits []bool `json:"uploaded_bits"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *ChunkUploadSession) UploadedChunks() []int {
|
||
|
|
var indices []int
|
||
|
|
for i, uploaded := range s.UploadedBits {
|
||
|
|
if uploaded {
|
||
|
|
indices = append(indices, i)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return indices
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *ChunkUploadSession) IsComplete() bool {
|
||
|
|
for _, b := range s.UploadedBits {
|
||
|
|
if !b {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
|
||
|
|
type InitChunkUploadRequest struct {
|
||
|
|
Filename string `json:"filename" binding:"required"`
|
||
|
|
FileSize int64 `json:"file_size" binding:"required,min=1"`
|
||
|
|
ChunkSize int64 `json:"chunk_size" binding:"required,min=1"`
|
||
|
|
TotalChunks int `json:"total_chunks" binding:"required,min=1"`
|
||
|
|
FileHash string `json:"file_hash" binding:"required"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type UploadChunkRequest struct {
|
||
|
|
UploadID string `form:"upload_id" binding:"required"`
|
||
|
|
ChunkIndex int `form:"chunk_index" binding:"min=0"`
|
||
|
|
ChunkHash string `form:"chunk_hash" binding:"required"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type ChunkStatusRequest struct {
|
||
|
|
UploadID string `json:"upload_id" binding:"required"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type CompleteChunkUploadRequest struct {
|
||
|
|
UploadID string `json:"upload_id" binding:"required"`
|
||
|
|
}
|