只有一个文件地址,但是没有文件名称,文件地址:http://XXXXXXX/getfile.aspx?fileid=999
但是系统需要把文件名称也写入到数据库
可以根据 resp.Header["Content-Disposition"] 获取文件名
resp.Header["Content-Disposition"]是一个 JSON对象
[{[0]:"attachement;filename=BT-3189%e4%b8%8b%e5%a3%b3(TD).pdf"}]
//复制文件到本地
func copyOaFileToPms(fileid) (int, error) {
filePath := "http://XXXXXXX/getfile.aspx?fileid=" + fileid
resp, err := http.Get(filePath)
if err != nil {
return 0, err
}
defer resp.Body.Close()
fileName := getFilenameFromContentDisposition(resp.Header["Content-Disposition"])
fmt.Println("文件名为:", fileName)
fileName, _ = url.QueryUnescape(fileName)
fmt.Println("解码后文件名为:", fileName)
if len(fileName) == 0 {
sbjlog.Debug("copyOaFileToPms 根据文件名获取文件id失败,fileName:%v", fileName)
return 0, errors.New("获取文件名称失败")
}
// 获取文件后缀名
fileExt := path.Ext(fileName)
// 得到文件名不带后缀
onlyFileName := strings.TrimSuffix(fileName, fileExt)
onlyFileName = strings.ToUpper(onlyFileName) //文件名转大写
fileNameAndExt := onlyFileName + strings.TrimPrefix(fileExt, ".") //文件名+后缀,作为新的文件名
......
}
// 从 Content-Disposition 头部信息中提取文件名
func getFilenameFromContentDisposition(contentDispositions []string) string {
filename := ""
for _, part := range contentDispositions {
keyValue := strings.SplitN(part, "=", 2)
if len(keyValue) == 2 && strings.Contains(keyValue[0], "filename") {
filename = keyValue[1]
return filename
}
}
return filename
}
files := "E:\\data\\test.txt"
paths, fileName := filepath.Split(files)
fmt.Println(paths, fileName) //获取路径中的目录及文件名 E:\data\ test.txt
fmt.Println(filepath.Base(files)) //获取路径中的文件名test.txt
fmt.Println(path.Ext(files)) //获取路径中的文件的后缀 .txt