golang下载图片,而非预览

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 小结

原文地址:https://www.cnblogs.com/fanbi/p/12048043.html