前言

通常用户上传文件之后会进行重命名(随机),而下载的时候如果还是使用重命名的话对用户来说保存下来不够友好,所以在下载的时候我们通常会对于名字再次做重命名,方便用户下载之后进行分类和使用。

前端实现

当然如果使用 a 标签实现,我们可以非常快速的通过 download 属性来实现,主流的浏览器也支持了这个属性。

1
<a href="link/to/your/download/file" download="filename">Download link</a>

后端实现

其实通过后端来实现也非常简单,以 gin 框架举例,可以直接使用 FileAttachment 方法。

1
2
3
4
r.GET("/download", func(c *gin.Context) {
// ...
c.FileAttachment(fileLocalPath, originalFilename)
})

其中 fileLocalPath 是文件本地目录,而 originalFilename 则是下载时要指定的文件名字。

当然不使用 FileAttachment 方法也可以,通过指定 Content-Disposition header 实现的

1
2
3
4
5
6
7
8
func (c *Context) FileAttachment(filepath, filename string) {
if isASCII(filename) {
c.Writer.Header().Set("Content-Disposition", `attachment; filename="`+escapeQuotes(filename)+`"`)
} else {
c.Writer.Header().Set("Content-Disposition", `attachment; filename*=UTF-8''`+url.QueryEscape(filename))
}
http.ServeFile(c.Writer, c.Request, filepath)
}

然后指定 attachment; filename*=UTF-8'' + 文件名称就可以了