chore: Merge pull request #1167 from Xhofe/dev
This commit is contained in:
commit
c35d54d092
@ -124,6 +124,13 @@ func InitSettings() {
|
|||||||
Access: model.PUBLIC,
|
Access: model.PUBLIC,
|
||||||
Group: model.FRONT,
|
Group: model.FRONT,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Key: "pdf viewer url",
|
||||||
|
Type: "string",
|
||||||
|
Value: "https://alist-org.github.io/pdf.js/web/viewer.html?file=$url",
|
||||||
|
Access: model.PUBLIC,
|
||||||
|
Group: model.FRONT,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Key: "autoplay video",
|
Key: "autoplay video",
|
||||||
Value: "false",
|
Value: "false",
|
||||||
|
@ -40,7 +40,7 @@ var (
|
|||||||
"go", "sh", "c", "cpp", "h", "hpp", "tsx", "vtt", "srt", "ass"}
|
"go", "sh", "c", "cpp", "h", "hpp", "tsx", "vtt", "srt", "ass"}
|
||||||
DProxyTypes = []string{"m3u8"}
|
DProxyTypes = []string{"m3u8"}
|
||||||
OfficeTypes = []string{"doc", "docx", "xls", "xlsx", "ppt", "pptx", "pdf"}
|
OfficeTypes = []string{"doc", "docx", "xls", "xlsx", "ppt", "pptx", "pdf"}
|
||||||
VideoTypes = []string{"mp4", "mkv", "avi", "mov", "rmvb", "webm", "flv"}
|
VideoTypes = []string{"mp4", "mkv", "avi", "mov", "rmvb", "webm", "flv", "m4v"}
|
||||||
AudioTypes = []string{"mp3", "flac", "ogg", "m4a", "wav", "opus"}
|
AudioTypes = []string{"mp3", "flac", "ogg", "m4a", "wav", "opus"}
|
||||||
ImageTypes = []string{"jpg", "tiff", "jpeg", "png", "gif", "bmp", "svg", "ico", "swf", "webp"}
|
ImageTypes = []string{"jpg", "tiff", "jpeg", "png", "gif", "bmp", "svg", "ico", "swf", "webp"}
|
||||||
)
|
)
|
||||||
|
@ -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 {
|
||||||
|
@ -17,7 +17,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/cookiejar"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -94,18 +93,11 @@ type LoginResp struct {
|
|||||||
|
|
||||||
// Login refer to PanIndex
|
// Login refer to PanIndex
|
||||||
func (driver Cloud189) Login(account *model.Account) error {
|
func (driver Cloud189) Login(account *model.Account) error {
|
||||||
client, ok := client189Map[account.Name]
|
client := resty.New()
|
||||||
if !ok {
|
|
||||||
//cookieJar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
|
|
||||||
client = resty.New()
|
|
||||||
//client.SetCookieJar(cookieJar)
|
//client.SetCookieJar(cookieJar)
|
||||||
client.SetTimeout(base.DefaultTimeout)
|
client.SetTimeout(base.DefaultTimeout)
|
||||||
client.SetRetryCount(3)
|
client.SetRetryCount(3)
|
||||||
client.SetHeader("Referer", "https://cloud.189.cn/")
|
client.SetHeader("Referer", "https://cloud.189.cn/")
|
||||||
}
|
|
||||||
// clear cookie
|
|
||||||
jar, _ := cookiejar.New(nil)
|
|
||||||
client.SetCookieJar(jar)
|
|
||||||
url := "https://cloud.189.cn/api/portal/loginUrl.action?redirectURL=https%3A%2F%2Fcloud.189.cn%2Fmain.action"
|
url := "https://cloud.189.cn/api/portal/loginUrl.action?redirectURL=https%3A%2F%2Fcloud.189.cn%2Fmain.action"
|
||||||
b := ""
|
b := ""
|
||||||
lt := ""
|
lt := ""
|
||||||
@ -131,7 +123,8 @@ func (driver Cloud189) Login(account *model.Account) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if lt == "" {
|
if lt == "" {
|
||||||
return fmt.Errorf("get page: %s \nstatus: %d \nrequest url: %s", b, res.StatusCode(), res.RawResponse.Request.URL.String())
|
return fmt.Errorf("get page: %s \nstatus: %d \nrequest url: %s\nredirect url: %s",
|
||||||
|
b, res.StatusCode(), res.RawResponse.Request.URL.String(), res.Header().Get("location"))
|
||||||
}
|
}
|
||||||
captchaToken := regexp.MustCompile(`captchaToken' value='(.+?)'`).FindStringSubmatch(b)[1]
|
captchaToken := regexp.MustCompile(`captchaToken' value='(.+?)'`).FindStringSubmatch(b)[1]
|
||||||
returnUrl := regexp.MustCompile(`returnUrl = '(.+?)'`).FindStringSubmatch(b)[1]
|
returnUrl := regexp.MustCompile(`returnUrl = '(.+?)'`).FindStringSubmatch(b)[1]
|
||||||
|
@ -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()
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"github.com/Xhofe/alist/model"
|
"github.com/Xhofe/alist/model"
|
||||||
"github.com/Xhofe/alist/utils"
|
"github.com/Xhofe/alist/utils"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func KeyCache(path string, account *model.Account) string {
|
func KeyCache(path string, account *model.Account) string {
|
||||||
@ -15,6 +16,9 @@ func KeyCache(path string, account *model.Account) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func SaveSearchFiles[T model.ISearchFile](key string, obj []T) {
|
func SaveSearchFiles[T model.ISearchFile](key string, obj []T) {
|
||||||
|
if strings.Contains(key, ".balance") {
|
||||||
|
return
|
||||||
|
}
|
||||||
err := model.DeleteSearchFilesByPath(key)
|
err := model.DeleteSearchFilesByPath(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorln("failed create search files", err)
|
log.Errorln("failed create search files", err)
|
||||||
|
@ -195,7 +195,7 @@ func (driver SFTP) Delete(path string, account *model.Account) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return client.Remove(utils.Join(account.RootFolder, path))
|
return client.remove(utils.Join(account.RootFolder, path))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (driver SFTP) Upload(file *model.FileStream, account *model.Account) error {
|
func (driver SFTP) Upload(file *model.FileStream, account *model.Account) error {
|
||||||
|
@ -49,7 +49,7 @@ func (client *Client) Files(remotePath string) ([]os.FileInfo, error) {
|
|||||||
return client.ReadDir(remotePath)
|
return client.ReadDir(remotePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *Client) Remove(remotePath string) error {
|
func (client *Client) remove(remotePath string) error {
|
||||||
f, err := client.Stat(remotePath)
|
f, err := client.Stat(remotePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
|
@ -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 {
|
||||||
|
@ -50,7 +50,7 @@ func Static(r *gin.Engine) {
|
|||||||
c.Status(200)
|
c.Status(200)
|
||||||
if strings.HasPrefix(c.Request.URL.Path, "/@manage") {
|
if strings.HasPrefix(c.Request.URL.Path, "/@manage") {
|
||||||
_, _ = c.Writer.WriteString(conf.ManageHtml)
|
_, _ = c.Writer.WriteString(conf.ManageHtml)
|
||||||
} else if strings.HasPrefix(c.Request.URL.Path, "/debug/pprof") {
|
} else if strings.HasPrefix(c.Request.URL.Path, "/debug/pprof") && conf.Debug {
|
||||||
pprof.Index(c.Writer, c.Request)
|
pprof.Index(c.Writer, c.Request)
|
||||||
} else {
|
} else {
|
||||||
_, _ = c.Writer.WriteString(conf.IndexHtml)
|
_, _ = c.Writer.WriteString(conf.IndexHtml)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user