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

  • 相关阅读:
    Hystrix高可用系统容错框架,资源隔离,熔断,限流
    Leecode no.25 K 个一组翻转链表
    no.1 Web浏览器
    源码解析-JavaNIO之Buffer,Channel
    Leecode no.24 两两交换链表中的节点
    Kafka RocketMQ 是推还是拉?
    Leecode no.23 合并K个升序链表
    图解计算机底层IO过程及JavaNIO
    Leecode no.21 合并两个有序链表
    AcWing每日一题--摘花生
  • 原文地址:https://www.cnblogs.com/fanbi/p/12048043.html
Copyright © 2011-2022 走看看