mirror of https://github.com/Xhofe/alist
commit
866df0540b
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
tempFile, err := ioutil.TempFile(conf.Conf.TempDir, "file-*")
|
const DEFAULT int64 = 10485760
|
||||||
if err != nil {
|
var uploadFile io.Reader
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer tempFile.Close()
|
|
||||||
defer os.Remove(tempFile.Name())
|
|
||||||
h := md5.New()
|
h := md5.New()
|
||||||
if _, err = io.Copy(io.MultiWriter(tempFile, h), file); err != nil {
|
if account.Bool1 && file.GetSize() > uint64(DEFAULT) {
|
||||||
return err
|
// 只计算前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-*")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
_ = tempFile.Close()
|
||||||
|
_ = os.Remove(tempFile.Name())
|
||||||
|
}()
|
||||||
|
|
||||||
|
if _, err = io.Copy(io.MultiWriter(tempFile, h), file); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = tempFile.Seek(0, io.SeekStart)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
uploadFile = tempFile
|
||||||
}
|
}
|
||||||
etag := hex.EncodeToString(h.Sum(nil))
|
etag := hex.EncodeToString(h.Sum(nil))
|
||||||
|
|
||||||
_, err = tempFile.Seek(0, io.SeekStart)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue