1 前言
网上查询使用html5,a增加属性download和使用表单get,post提交,都是只能预览,根本原因是返回值需要加入头
w.Header().Add("Content-Type", "application/octet-stream")
w.Header().Add("Content-Disposition", "attachment; filename=""+filename+""")
告知浏览器返回值是附件形式下载即可。
2 代码
package DownloadController
import (
"fmt"
"net/http"
"strings"
"Project/Utils"
"Project/Server/Download"
)
func DownloadController(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
w.Header().Set("Access-Control-Allow-Origin", "*") // 允许访问所有域
w.Header().Add("Access-Control-Allow-Headers", "Content-Type") // header的类型
switch r.Method {
case "POST", "GET":
{
urlname := r.FormValue("url")
if strings.EqualFold(urlname, "") {
resp_json := Utils.GetRespJson(400, "请求参数错误!", nil)
fmt.Fprintln(w, string(resp_json))
return
}
filename, content, err := DownloadServer.Download(urlname)
w.Header().Add("Content-Type", "application/octet-stream")
w.Header().Add("Content-Disposition", "attachment; filename=""+filename+""")
if err != nil {
fmt.Println("Read File Err:", err.Error())
resp_json := Utils.GetRespJson(400, "下载失败!", nil)
fmt.Fprintln(w, string(resp_json))
return
} else {
w.Write(content)
fmt.Println("Download filename=" + filename + " OK")
//resp_json := Utils.GetRespJson(200, "下载成功!", nil)
//fmt.Fprintln(w, string(resp_json))
}
return
}
default:
resp_json := Utils.GetRespJson(400, "错误的请求方式!", nil)
fmt.Fprintln(w, string(resp_json))
return
}
}
package DownloadServer
import (
"fmt"
"Project/Utils/Config"
"os"
"io/ioutil"
"strings"
"net/url"
"time"
)
func Download(urlname string) (filename string, content []byte, err error) {
pos1 := strings.LastIndex(urlname,"Resources")
urlname = urlname[pos1:]
path := Config.GetValue("project_path") + "/web/"
file, err := os.Open(path + urlname)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
content, err = ioutil.ReadAll(file)
pos := strings.LastIndex(urlname, "/") + 1
zipNameNew := urlname[pos:]
// 防止中文乱码
timeStr := time.Now().Format("2006010203040506")
filename = url.QueryEscape("Res" + timeStr + "_" + zipNameNew)
return
}
3 小结
略