Comments and clean on download
Former-commit-id: 3d869836823fd87d28dcaa3d3280e8dfaaadf00d [formerly f8481d704990ba762ebf01995b157b3a4a034e9b] [formerly b2d229ddb0ef95d20bc51622ad62ff2c8a235b5a [formerly 0fc30ab1b6
]]
Former-commit-id: 79a72ef077f3be66ceb74d1496c336f3edcd18cd [formerly 031550bb40724ef2ce161305011a8432413b2840]
Former-commit-id: 5849301db71d34084b3a9a408197099fcfe4179c
pull/726/head
parent
05896697fa
commit
477816aa25
34
download.go
34
download.go
|
@ -9,6 +9,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/hacdias/filemanager/dir"
|
||||||
"github.com/mholt/archiver"
|
"github.com/mholt/archiver"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,6 +18,8 @@ import (
|
||||||
func downloadHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
|
func downloadHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
|
||||||
query := r.URL.Query().Get("format")
|
query := r.URL.Query().Get("format")
|
||||||
|
|
||||||
|
// If the file isn't a directory, serve it using http.ServeFile. We display it
|
||||||
|
// inline if it is requested.
|
||||||
if !c.FI.IsDir {
|
if !c.FI.IsDir {
|
||||||
if r.URL.Query().Get("inline") == "true" {
|
if r.URL.Query().Get("inline") == "true" {
|
||||||
w.Header().Set("Content-Disposition", "inline")
|
w.Header().Set("Content-Disposition", "inline")
|
||||||
|
@ -31,21 +34,25 @@ func downloadHandler(c *RequestContext, w http.ResponseWriter, r *http.Request)
|
||||||
files := []string{}
|
files := []string{}
|
||||||
names := strings.Split(r.URL.Query().Get("files"), ",")
|
names := strings.Split(r.URL.Query().Get("files"), ",")
|
||||||
|
|
||||||
|
// If there are files in the query, sanitize their names.
|
||||||
|
// Otherwise, just append the current path.
|
||||||
if len(names) != 0 {
|
if len(names) != 0 {
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
|
// Unescape the name.
|
||||||
name, err := url.QueryUnescape(name)
|
name, err := url.QueryUnescape(name)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return http.StatusInternalServerError, err
|
return http.StatusInternalServerError, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clean the slashes.
|
||||||
|
name = dir.SlashClean(name)
|
||||||
files = append(files, filepath.Join(c.FI.Path, name))
|
files = append(files, filepath.Join(c.FI.Path, name))
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
files = append(files, c.FI.Path)
|
files = append(files, c.FI.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the format is true, just set it to "zip".
|
||||||
if query == "true" {
|
if query == "true" {
|
||||||
query = "zip"
|
query = "zip"
|
||||||
}
|
}
|
||||||
|
@ -57,12 +64,13 @@ func downloadHandler(c *RequestContext, w http.ResponseWriter, r *http.Request)
|
||||||
tempfile string
|
tempfile string
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Create a temporary directory.
|
||||||
temp, err = ioutil.TempDir("", "")
|
temp, err = ioutil.TempDir("", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return http.StatusInternalServerError, err
|
return http.StatusInternalServerError, err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer os.RemoveAll(temp)
|
defer os.RemoveAll(temp)
|
||||||
|
|
||||||
tempfile = filepath.Join(temp, "temp")
|
tempfile = filepath.Join(temp, "temp")
|
||||||
|
|
||||||
switch query {
|
switch query {
|
||||||
|
@ -84,17 +92,21 @@ func downloadHandler(c *RequestContext, w http.ResponseWriter, r *http.Request)
|
||||||
return http.StatusInternalServerError, err
|
return http.StatusInternalServerError, err
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.Open(temp + "/temp")
|
// Defines the file name.
|
||||||
if err != nil {
|
|
||||||
return http.StatusInternalServerError, err
|
|
||||||
}
|
|
||||||
|
|
||||||
name := c.FI.Name
|
name := c.FI.Name
|
||||||
if name == "." || name == "" {
|
if name == "." || name == "" {
|
||||||
name = "download"
|
name = "download"
|
||||||
}
|
}
|
||||||
|
name += extension
|
||||||
|
|
||||||
w.Header().Set("Content-Disposition", "attachment; filename="+name+extension)
|
// Opens the file so it can be downloaded.
|
||||||
io.Copy(w, file)
|
file, err := os.Open(temp + "/temp")
|
||||||
return 0, nil
|
if err != nil {
|
||||||
|
return http.StatusInternalServerError, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
w.Header().Set("Content-Disposition", "attachment; filename="+name)
|
||||||
|
_, err = io.Copy(w, file)
|
||||||
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue