fix(local): filename with whitespace issue (#3928)

* fix(local): filename whitespace problem

* fix(deps): remove deprecated package io/ioutil

---------

Co-authored-by: XZB <i@1248.ink>
pull/3932/head
XZB-1248 2023-03-23 15:18:37 +08:00 committed by GitHub
parent c6af22b97e
commit 0eab31bdf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 9 deletions

View File

@ -6,7 +6,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"net/http" "net/http"
"os" "os"
stdpath "path" stdpath "path"
@ -68,7 +67,7 @@ func (d *Local) GetAddition() driver.Additional {
func (d *Local) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { func (d *Local) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
fullPath := dir.GetPath() fullPath := dir.GetPath()
rawFiles, err := ioutil.ReadDir(fullPath) rawFiles, err := readDir(fullPath)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -3,10 +3,12 @@ package local
import ( import (
"bytes" "bytes"
"fmt" "fmt"
ffmpeg "github.com/u2takey/ffmpeg-go"
"io/fs" "io/fs"
"os" "os"
"path/filepath" "path/filepath"
"sort"
ffmpeg "github.com/u2takey/ffmpeg-go"
) )
func isSymlinkDir(f fs.FileInfo, path string) bool { func isSymlinkDir(f fs.FileInfo, path string) bool {
@ -39,3 +41,17 @@ func GetSnapshot(videoPath string, frameNum int) (imgData *bytes.Buffer, err err
} }
return srcBuf, nil return srcBuf, nil
} }
func readDir(dirname string) ([]fs.FileInfo, error) {
f, err := os.Open(dirname)
if err != nil {
return nil, err
}
list, err := f.Readdir(-1)
f.Close()
if err != nil {
return nil, err
}
sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
return list, nil
}

View File

@ -4,8 +4,8 @@ import (
"context" "context"
"encoding/base64" "encoding/base64"
"errors" "errors"
"io/ioutil"
"net/url" "net/url"
"os"
"time" "time"
) )
@ -89,7 +89,7 @@ func (c *client) AddURI(uris []string, options ...interface{}) (gid string, err
// If a file with the same name already exists, it is overwritten! // If a file with the same name already exists, it is overwritten!
// If the file cannot be saved successfully or --rpc-save-upload-metadata is false, the downloads added by this method are not saved by --save-session. // If the file cannot be saved successfully or --rpc-save-upload-metadata is false, the downloads added by this method are not saved by --save-session.
func (c *client) AddTorrent(filename string, options ...interface{}) (gid string, err error) { func (c *client) AddTorrent(filename string, options ...interface{}) (gid string, err error) {
co, err := ioutil.ReadFile(filename) co, err := os.ReadFile(filename)
if err != nil { if err != nil {
return return
} }
@ -120,7 +120,7 @@ func (c *client) AddTorrent(filename string, options ...interface{}) (gid string
// If a file with the same name already exists, it is overwritten! // If a file with the same name already exists, it is overwritten!
// If the file cannot be saved successfully or --rpc-save-upload-metadata is false, the downloads added by this method are not saved by --save-session. // If the file cannot be saved successfully or --rpc-save-upload-metadata is false, the downloads added by this method are not saved by --save-session.
func (c *client) AddMetalink(filename string, options ...interface{}) (gid []string, err error) { func (c *client) AddMetalink(filename string, options ...interface{}) (gid []string, err error) {
co, err := ioutil.ReadFile(filename) co, err := os.ReadFile(filename)
if err != nil { if err != nil {
return return
} }

View File

@ -3,7 +3,6 @@ package common
import ( import (
"fmt" "fmt"
"io" "io"
"io/ioutil"
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
@ -61,7 +60,8 @@ func Proxy(w http.ResponseWriter, r *http.Request, link *model.Link, file model.
if err != nil { if err != nil {
return err return err
} }
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"; filename*=UTF-8''%s`, file.GetName(), url.QueryEscape(file.GetName()))) filename := file.GetName()
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"; filename*=UTF-8''%s`, filename, url.PathEscape(filename)))
http.ServeContent(w, r, file.GetName(), fileStat.ModTime(), f) http.ServeContent(w, r, file.GetName(), fileStat.ModTime(), f)
return nil return nil
} else { } else {
@ -93,7 +93,7 @@ func Proxy(w http.ResponseWriter, r *http.Request, link *model.Link, file model.
} }
w.WriteHeader(res.StatusCode) w.WriteHeader(res.StatusCode)
if res.StatusCode >= 400 { if res.StatusCode >= 400 {
all, _ := ioutil.ReadAll(res.Body) all, _ := io.ReadAll(res.Body)
msg := string(all) msg := string(all)
log.Debugln(msg) log.Debugln(msg)
return errors.New(msg) return errors.New(msg)