zoukankan      html  css  js  c++  java
  • 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 小结

  • 相关阅读:
    cloudstack secondary vm starting
    什么东西有机会
    ansible 远程以普通用户执行命令
    python 爬虫--同花顺-使用代理
    python3 Beautifulsoup <class 'bs4.element.ResultSet'> <class 'bs4.element.Tag'> 取值
    python3 raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbid
    kubernetes 生命周期问题分析
    'utf-8' codec can't decode byte 0xbc in position 1182: invalid start byte
    找回Firefox4的状态栏!Status-4-Evar扩展
    生命周期和Zend引擎
  • 原文地址:https://www.cnblogs.com/fanbi/p/12048043.html
Copyright © 2011-2022 走看看