在文件下载中,我们需要设置一个header头,在浏览器下载文件时,指定下载文件的文件名。Content-Disposition,这里做的实用golang就是取出设置在header中的文件名。

服务器设置该header(这里是使用的gin框架)。

1
c.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName))

使用mime.ParseMediaType函数解析。

代码中使用resty库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 下载文件
req := resty.R()
resp, err := req.SetBody(map[string]string{}).
Post("xxxxxxxxxxx") // download接口
if err != nil {
log.Debug("http request error,", err)
c.JSON(http.StatusInternalServerError, ERROR["INTERNAL_ERROR"])
return
}

// 获取filename
getDispos := resp.Header().Get("Content-Disposition")
if getDispos != "" {
_, params, err := mime.ParseMediaType(getDispos)
if err != nil {
log.Debug("http request error,", err)
c.JSON(http.StatusInternalServerError, ERROR["INTERNAL_ERROR"])
return
}
fileName, ok = params["filename"]
if !ok {
log.Debug("filename parameter not exist!")
c.JSON(http.StatusInternalServerError, ERROR["INTERNAL_ERROR"])
return
}
}

go client发送文件,即multipart/form-data

可以参考go-resty/resty

原生库可以参考Go http 如何发送 multipart/form-data (发送文件)?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
_ = bodyWriter.WriteField("param", string(param))
defer bodyWriter.Close()

req, err := http.NewRequest("POST", callbackUrl, bodyBuf)
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", bodyWriter.FormDataContentType())
req.WithContext(ctx)

resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()