这里逻辑不太对
来源:6-8 编码实战:分块上传接口升级(支持断点续传)

qq_白澤_0
2021-08-17
还是我想错了。
chunksExist := []int{}
if uploadID == "" {
uploadID = username + fmt.Sprintf("%x", time.Now().UnixNano())
} else {
chunks, err := redis.Values(rConn.Do("HGETALL", ChunkKeyPrefix+uploadID))
if err != nil {
w.Write(util.NewRespMsg(-2, "Upload part failed", err.Error()).JSONBytes())
return
}
for i := 0; i < len(chunks); i += 2 {
k := string(chunks[i].([]byte))
v := string(chunks[i+1].([]byte))
if strings.HasPrefix(k, "chkidx_") && v == "1" {
// chkidx_6 -> 6
chunkIdx, _ := strconv.Atoi(k[7:len(k)])
chunksExist = append(chunksExist, chunkIdx)
}
}
}
...
if len(upInfo.ChunkExists) <= 0 {
hkey := ChunkKeyPrefix + upInfo.UploadID
rConn.Do("HSET", hkey, "chunkcount", upInfo.ChunkCount)
rConn.Do("HSET", hkey, "filehash", upInfo.FileHash)
rConn.Do("HSET", hkey, "filesize", upInfo.FileSize)
rConn.Do("EXPIRE", hkey, 43200)
rConn.Do("SET", HashUpIDKeyPrefix+filehash, upInfo.UploadID, "EX", 43200)
}
具体上传逻辑
// 4. 更新redis缓存状态
rConn.Do("HSET", ChunkKeyPrefix+uploadID, "chkidx_"+chunkIndex, 1)
也就是说初始化的时候会保存一条上传存在string类型的记录。结构体的上传分块列表只存在于内存中,每次具体上传的时候并没有更新已上传列表。
也就是说判断断点续传通过判断string类型的记录是否存在。
但是为什么不采用每次上传分块更新分块列表,然后更新一条分块数量的hash类型记录?通过比对该记录的value和初始化的chunkcount可以判断上传完成、是否断点续传?
应该是更简单的逻辑啊
写回答
1回答
-
xiaomo
2021-08-18
但是为什么不采用每次上传分块更新分块列表,然后更新一条分块数量的hash类型记录?通过比对该记录的value和初始化的chunkcount可以判断上传完成、是否断点续传?
不太明白这里的意思呢?课程中代码这么设计的一个原因时,在断点续传查看进度信息时,可以快速拿到还没有完成上传的分块列表,而不仅仅是判断断点上传是否已经完成。
00
相似问题