chore: Merge pull request #1110 from foxxorcat/dev

增加123流式上传选择
pull/1167/head
Noah Hsu 2022-05-17 12:49:22 +08:00 committed by GitHub
commit 866df0540b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 66 additions and 28 deletions

View File

@ -1,7 +1,9 @@
package _23 package _23
import ( import (
"bytes"
"crypto/md5" "crypto/md5"
"encoding/binary"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io" "io"
@ -68,6 +70,12 @@ func (driver Pan123) Items() []base.Item {
Required: true, Required: true,
Default: "asc", Default: "asc",
}, },
{
Name: "bool_1",
Label: "stream upload",
Type: base.TypeBool,
Description: "io stream upload (test)",
},
} }
} }
@ -302,23 +310,44 @@ func (driver Pan123) Upload(file *model.FileStream, account *model.Account) erro
return base.ErrNotFolder return base.ErrNotFolder
} }
const DEFAULT int64 = 10485760
var uploadFile io.Reader
h := md5.New()
if account.Bool1 && file.GetSize() > uint64(DEFAULT) {
// 只计算前10MIB
buf := bytes.NewBuffer(make([]byte, 0, DEFAULT))
if n, err := io.CopyN(io.MultiWriter(buf, h), file, DEFAULT); err != io.EOF && n == 0 {
return err
}
// 增加额外参数防止MD5碰撞
h.Write([]byte(file.Name))
num := make([]byte, 8)
binary.BigEndian.PutUint64(num, file.Size)
h.Write(num)
// 拼装
uploadFile = io.MultiReader(buf, file)
} else {
// 计算完整文件MD5
tempFile, err := ioutil.TempFile(conf.Conf.TempDir, "file-*") tempFile, err := ioutil.TempFile(conf.Conf.TempDir, "file-*")
if err != nil { if err != nil {
return err return err
} }
defer tempFile.Close() defer func() {
defer os.Remove(tempFile.Name()) _ = tempFile.Close()
h := md5.New() _ = os.Remove(tempFile.Name())
}()
if _, err = io.Copy(io.MultiWriter(tempFile, h), file); err != nil { if _, err = io.Copy(io.MultiWriter(tempFile, h), file); err != nil {
return err return err
} }
etag := hex.EncodeToString(h.Sum(nil))
_, err = tempFile.Seek(0, io.SeekStart) _, err = tempFile.Seek(0, io.SeekStart)
if err != nil { if err != nil {
return err return err
} }
uploadFile = tempFile
}
etag := hex.EncodeToString(h.Sum(nil))
data := base.Json{ data := base.Json{
"driveId": 0, "driveId": 0,
"duplicate": 2, // 2->覆盖 1->重命名 0->默认 "duplicate": 2, // 2->覆盖 1->重命名 0->默认
@ -352,7 +381,7 @@ func (driver Pan123) Upload(file *model.FileStream, account *model.Account) erro
input := &s3manager.UploadInput{ input := &s3manager.UploadInput{
Bucket: &resp.Data.Bucket, Bucket: &resp.Data.Bucket,
Key: &resp.Data.Key, Key: &resp.Data.Key,
Body: tempFile, Body: uploadFile,
} }
_, err = uploader.Upload(input) _, err = uploader.Upload(input)
if err != nil { if err != nil {

View File

@ -607,7 +607,7 @@ func (driver Cloud189) CommonUpload(file *model.FileStream, parentFile *model.Fi
uploadData := uploadUrl.UploadUrls[fmt.Sprint("partNumber_", i)] uploadData := uploadUrl.UploadUrls[fmt.Sprint("partNumber_", i)]
req, _ := http.NewRequest(http.MethodPut, uploadData.RequestURL, byteData) req, _ := http.NewRequest(http.MethodPut, uploadData.RequestURL, byteData)
req.Header.Del("User-Agent") req.Header.Set("User-Agent", "")
for k, v := range ParseHttpHeader(uploadData.RequestHeader) { for k, v := range ParseHttpHeader(uploadData.RequestHeader) {
req.Header.Set(k, v) req.Header.Set(k, v)
} }
@ -650,9 +650,10 @@ func (driver Cloud189) FastUpload(file *model.FileStream, parentFile *model.File
if err != nil { if err != nil {
return err return err
} }
defer tempFile.Close() defer func() {
defer os.Remove(tempFile.Name()) _ = tempFile.Close()
_ = os.Remove(tempFile.Name())
}()
// 初始化上传 // 初始化上传
state := GetState(account) state := GetState(account)
@ -718,7 +719,7 @@ func (driver Cloud189) FastUpload(file *model.FileStream, parentFile *model.File
for i := 1; i <= count; i++ { for i := 1; i <= count; i++ {
uploadData := uploadUrls.UploadUrls[fmt.Sprint("partNumber_", i)] uploadData := uploadUrls.UploadUrls[fmt.Sprint("partNumber_", i)]
req, _ := http.NewRequest(http.MethodPut, uploadData.RequestURL, io.NewSectionReader(tempFile, int64(i-1)*DEFAULT, DEFAULT)) req, _ := http.NewRequest(http.MethodPut, uploadData.RequestURL, io.NewSectionReader(tempFile, int64(i-1)*DEFAULT, DEFAULT))
req.Header.Del("User-Agent") req.Header.Set("User-Agent", "")
for k, v := range ParseHttpHeader(uploadData.RequestHeader) { for k, v := range ParseHttpHeader(uploadData.RequestHeader) {
req.Header.Set(k, v) req.Header.Set(k, v)
} }
@ -756,8 +757,10 @@ func (driver Cloud189) uploadFamily(file *model.FileStream, parentFile *model.Fi
return err return err
} }
defer tempFile.Close() defer func() {
defer os.Remove(tempFile.Name()) _ = tempFile.Close()
_ = os.Remove(tempFile.Name())
}()
fileMd5 := md5.New() fileMd5 := md5.New()
if _, err = io.Copy(io.MultiWriter(fileMd5, tempFile), file); err != nil { if _, err = io.Copy(io.MultiWriter(fileMd5, tempFile), file); err != nil {
@ -805,8 +808,10 @@ func (driver Cloud189) uploadPerson(file *model.FileStream, parentFile *model.Fi
return err return err
} }
defer tempFile.Close() defer func() {
defer os.Remove(tempFile.Name()) _ = tempFile.Close()
_ = os.Remove(tempFile.Name())
}()
fileMd5 := md5.New() fileMd5 := md5.New()
if _, err = io.Copy(io.MultiWriter(fileMd5, tempFile), file); err != nil { if _, err = io.Copy(io.MultiWriter(fileMd5, tempFile), file); err != nil {

View File

@ -467,8 +467,10 @@ func (driver AliDrive) Upload(file *model.FileStream, account *model.Account) er
return err return err
} }
defer tempFile.Close() defer func() {
defer os.Remove(tempFile.Name()) _ = tempFile.Close()
_ = os.Remove(tempFile.Name())
}()
delete(reqBody, "pre_hash") delete(reqBody, "pre_hash")
h := sha1.New() h := sha1.New()

View File

@ -363,8 +363,10 @@ func (driver XunLeiCloud) Upload(file *model.FileStream, account *model.Account)
return err return err
} }
defer tempFile.Close() defer func() {
defer os.Remove(tempFile.Name()) _ = tempFile.Close()
_ = os.Remove(tempFile.Name())
}()
gcid, err := getGcid(io.TeeReader(file, tempFile), int64(file.Size)) gcid, err := getGcid(io.TeeReader(file, tempFile), int64(file.Size))
if err != nil { if err != nil {