在文件下载中,我们需要设置一个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") if err != nil { log.Debug("http request error,", err) c.JSON(http.StatusInternalServerError, ERROR["INTERNAL_ERROR"]) return }
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()
|
本文标题:解析Content-Disposition,获取文件名
文章作者:小师
发布时间:2019-05-28
最后更新:2022-05-04
原始链接:chunlife.top/2019/05/28/解析Content-Disposition,获取文件名/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可