diff --git a/lxCommon/file.go b/lxCommon/file.go new file mode 100644 index 0000000..bd90555 --- /dev/null +++ b/lxCommon/file.go @@ -0,0 +1,99 @@ +package lxCommon + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "time" +) + +// 二进制流文件保存到本地 name png pdf +func SaveFile(url, path, name string) (filePath string, err error) { + c := NewClient() //忽略证书 + _dir := AddNewFile(path) + filePath = _dir + name + resp, err := c.Get(url) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + err = ioutil.WriteFile(filePath, body, 0644) + if err != nil { + fmt.Println(err) + return + } + return +} + +func AddNewFile(folder string) string { + oldPath := folder + if runtime.GOOS == "windows" || runtime.GOOS == "darwin" { + oldPath = "./pdf/" + } + _dir, _ := CreateDateDir(oldPath) + return _dir +} + +func Copy(src, dst string) (int64, error) { + sourceFileStat, err := os.Stat(src) + if err != nil { + return 0, err + } + if !sourceFileStat.Mode().IsRegular() { + return 0, fmt.Errorf("%s is not a regular file", src) + } + source, err := os.Open(src) + if err != nil { + return 0, err + } + defer source.Close() + destination, err := os.Create(dst) + if err != nil { + return 0, err + } + defer destination.Close() + nBytes, err := io.Copy(destination, source) + return nBytes, err +} + +func GetFileSize(filename string) (int64, error) { + fi, err := os.Stat(filename) + if err != nil { + return 0, err + } + return fi.Size() / 1024 / 1024, nil +} + +func CreateDateDir(basePath string) (dirPath, dataString string) { + folderName := time.Now().Format("2006-01-02") + folderPath := filepath.Join(basePath, folderName) + if _, err := os.Stat(folderPath); os.IsNotExist(err) { + // 必须分成两步 + // 先创建文件夹 + os.MkdirAll(folderPath, 0777) + // 再修改权限 + os.Chmod(folderPath, 0777) + } + return folderPath + "/", folderName +} + +// 判断文件夹/文件是否存在 +func PathIsExists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} diff --git a/lxCommon/http.go b/lxCommon/http.go new file mode 100644 index 0000000..ddfe64c --- /dev/null +++ b/lxCommon/http.go @@ -0,0 +1,129 @@ +package lxCommon + +import ( + "bytes" + "crypto/tls" + "github.com/bytedance/sonic" + "golang.org/x/net/publicsuffix" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "net/http/cookiejar" + "os" + "path/filepath" + "time" +) + +// url 路径 filename 文件的上传参数 +func PostFile(url string, files map[string]string, ext map[string]string) ([]byte, error) { + res := []byte{} + //创建一个模拟的form中的一个选项,这个form项现在是空的 + bodyBuf := &bytes.Buffer{} + bodyWriter := multipart.NewWriter(bodyBuf) + for k, v := range files { + //打开文件句柄操作 + file, err := os.Open(v) + if err != nil { + //fmt.Println("error opening file") + return res, err + } + defer file.Close() + //相当于现在还没选择文件, form项里选择文件的选项 + fileWriter, err := bodyWriter.CreateFormFile(k, filepath.Base(v)) + if err != nil { + //fmt.Println("error writing to buffer") + return res, err + } + //iocopy 这里相当于选择了文件,将文件放到form中 + _, err = io.Copy(fileWriter, file) + if err != nil { + return res, err + } + } + //获取上传文件的类型,multipart/form-data; boundary=... + contentType := bodyWriter.FormDataContentType() + //上传的其他参数 + for key, val := range ext { + _ = bodyWriter.WriteField(key, val) + } + //这个很关键,必须这样写关闭,不能使用defer关闭,不然会导致错误 + bodyWriter.Close() + //发送post请求到服务端 + resp, err := http.Post(url, contentType, bodyBuf) + if err != nil { + return res, err + } + defer resp.Body.Close() + res, err = ioutil.ReadAll(resp.Body) + if err != nil { + return res, err + } + return res, err +} + +func NewClient() *http.Client { + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + var c = &http.Client{ + Timeout: time.Duration(1000 * time.Second), + Transport: tr, + } + options := cookiejar.Options{ + PublicSuffixList: publicsuffix.List, + } + curCookieJar, _ := cookiejar.New(&options) + c.Jar = curCookieJar + return c +} + +func HttpJsonStr(c *http.Client, method, url string, header map[string]string, body io.Reader, v *string) error { + req, err := http.NewRequest(method, url, body) + if err != nil { + return err + } + for k, v := range header { + req.Header.Add(k, v) + } + resp, err := c.Do(req) + if err != nil { + return err + } + by, err := ioutil.ReadAll(resp.Body) + *v = string(by) + return nil +} +func HttpJson(c *http.Client, method, url string, header map[string]string, body io.Reader, data interface{}) error { + req, err := http.NewRequest(method, url, body) + if err != nil { + return err + } + for k, v := range header { + req.Header.Add(k, v) + } + resp, err := c.Do(req) + if err != nil { + return err + } + by, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + err = sonic.Unmarshal(by, data) + return err +} + +func HttpGetFile(url, path string) error { + res, err := http.Get(url) + if err != nil { + return err + } + f, err := os.Create(path) + defer f.Close() + if err != nil { + return err + } + _, err = io.Copy(f, res.Body) + return err +}