最近开发一个golang为开发后端接口语言的CMS,将几个标准件拆分出来分享下
图片上传代码:
/// 上传图片
func (Systemconfig) SaveUploadedFile(c *gin.Context ) {
headers ,err := c.FormFile("file")
fmt.Println(err)
if err != nil{
fmt.Println(err)
}
dst :=headers.Filename
fmt.Println(dst)
if err := c.SaveUploadedFile(headers,dst) ; err != nil{
fmt.Println(err)
}
}
记得引入gin框架,不然会报错;
代码写好后总是有点需求:现在上传的是上传到web root文件夹,图片多了就有点难看了吧,一般标配都是到upload之类的文件夹:
/// 上传图片
func (Systemconfig) SaveUploadedFile(c *gin.Context ) {
headers ,err := c.FormFile("file")
fmt.Println(err)
if err != nil{
fmt.Println(err)
}
//dst :=headers.Filename
dst := path.Join("./upload", headers.Filename) /// 添加到upload文件夹,这里没有验证和自动生成文件夹,所以需要手动创建文件夹,不然会报错
fmt.Println(dst)
if err := c.SaveUploadedFile(headers,dst) ; err != nil{
fmt.Println(err)
}
}
图片传好了,但是现在先改下文件名,上传的时候名叫 640.webp的文件想做的高端点变成:bc43a99a0f77c93ae7223c6a293f5b2c.webp这样的格式,就是时间戳加上一个随机数生成一个厉害的名字:
最终我的代码长这样:
/// 上传图片
func (Systemconfig) SaveUploadedFile(c *gin.Context ) {
headers ,err := c.FormFile("file")
fmt.Println(err)
if err != nil{
fmt.Println(err)
}
crutime := time.Now().Unix() + rand.Int63n(10)
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime , 10))
token := fmt.Sprintf("%x", h.Sum(nil))
//dst :=headers.Filename
dst := path.Join("./upload", headers.Filename)
fmt.Println(dst)
if err := c.SaveUploadedFile(headers,dst) ; err != nil{
fmt.Println(err)
}
fmt.Println("fullFilename =", headers.Filename)
var filenameWithSuffix string
filenameWithSuffix = path.Base(headers.Filename)
fmt.Println("filenameWithSuffix =", filenameWithSuffix)
var fileSuffix string
fileSuffix = path.Ext(filenameWithSuffix)
fmt.Println("fileSuffix =", fileSuffix)
var filenameOnly string
filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix)
fmt.Println("filenameOnly =", filenameOnly)
newdst :=path.Join("./upload" , token+""+fileSuffix)
os.Rename(dst , newdst)
}