add download method
This commit is contained in:
87
download.go
Normal file
87
download.go
Normal file
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* @Author: fuxiao
|
||||
* @Email: 576101059@qq.com
|
||||
* @Date: 2021/8/26 1:59 下午
|
||||
* @Desc: TODO
|
||||
*/
|
||||
|
||||
package http
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/dobyte/http/internal"
|
||||
)
|
||||
|
||||
var contentTypeToFileSuffix = map[string]string{
|
||||
"application/x-001": ".001",
|
||||
"text/h323": ".323",
|
||||
"drawing/907": ".907",
|
||||
"audio/x-mei-aac": ".acp",
|
||||
"audio/aiff": ".aif",
|
||||
"text/asa": ".asa",
|
||||
"text/asp": ".asp",
|
||||
"audio/basic": ".au",
|
||||
"application/vnd.adobe.workflow": ".awf",
|
||||
"application/x-bmp": ".bmp",
|
||||
"application/x-c4t": ".c4t",
|
||||
"application/x-cals": ".cal",
|
||||
"application/x-netcdf": ".cdf",
|
||||
"application/x-cel": ".cel",
|
||||
"application/x-g4": ".cg4",
|
||||
"application/x-cit": ".cit",
|
||||
"text/xml": ".cml",
|
||||
"application/x-cmx": ".cmx",
|
||||
"application/pkix-crl": ".crl",
|
||||
"application/x-csi": ".csi",
|
||||
"application/x-cut": ".cut",
|
||||
"application/x-dbm": ".dbm",
|
||||
}
|
||||
|
||||
type Download struct {
|
||||
request *Request
|
||||
}
|
||||
|
||||
func NewDownload(c *Client) *Download {
|
||||
return &Download{
|
||||
request: NewRequest(c),
|
||||
}
|
||||
}
|
||||
|
||||
// Download download a file from the network address to the local.
|
||||
func (d *Download) Download(url, dir string, filename ...string) (string, error) {
|
||||
resp, err := d.request.request(MethodGet, url)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var path string
|
||||
|
||||
if len(filename) > 0 {
|
||||
path = strings.TrimRight(dir, string(os.PathSeparator)) + string(os.PathSeparator) + filename[0]
|
||||
} else {
|
||||
path = d.genFilePath(resp, dir)
|
||||
}
|
||||
|
||||
if err = internal.SaveToFile(path, resp.ReadBytes()); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return path, nil
|
||||
}
|
||||
|
||||
// genFilePath generate file path based on response content type
|
||||
func (d *Download) genFilePath(resp *Response, dir string) string {
|
||||
path := strings.TrimRight(dir, string(os.PathSeparator)) + string(os.PathSeparator) + internal.RandStr(16)
|
||||
|
||||
if suffix := internal.GetFileType(resp.ReadBytes()); suffix != "" {
|
||||
path += "." + suffix
|
||||
}
|
||||
|
||||
if internal.Exists(path) {
|
||||
return d.genFilePath(resp, dir)
|
||||
}
|
||||
|
||||
return path
|
||||
}
|
Reference in New Issue
Block a user