Gin 文件上传

53 阅读1分钟

要处理文件上传,你可以使用multipart/form-data编码的表单。在HTML表单中,你需要设置enctype="multipart/form-data"。然后,在Gin中,你可以使用FormFile或SaveUploadedFile方法来处理上传的文件。

单文件上传

<form method="post" action="/api/file" enctype="multipart/form-data"> 
<div class="input-file-box">
    <span>点击上传图片</span>
    <input type="file" name="mfile" id="uploadfile" multiple> //name属性提供给后端接口
</div>
 <button type="submit" id="ensure">确认上传</button>
</form>
func (u UserController) FileUp(c *gin.Context) {
	file, err := c.FormFile("mfile")
	if err != nil {
		c.JSON(http.StatusBadRequest, SetOut(400, nil, err.Error()))
		return
	}
	extName := path.Ext(file.Filename)
	// 上传文件到指定的目录
	now := time.Now()
	dir := "./static/upload/" + now.Format("2006-01-02")
	fileUnixName := strconv.FormatInt(now.UnixNano(), 10)
	dst := path.Join(dir, fileUnixName+extName)
	c.SaveUploadedFile(file, dst)
	c.JSON(http.StatusOK, SetOut(200, dst))
}

多文件上传--不同名字的多个文件

<form method="post" action="/" enctype="multipart/form-data"> 
<div class="input-file-box">
    <span>点击上传图片</span>
    <input type="file" name="myGoodsImg1" id="uploadfile" multiple> //name属性提供给后端接口
    <input type="file" name="myGoodsImg2" id="uploadfile" multiple> 
</div>
 <button type="submit" id="ensure">确认上传</button>
</form>
//只需要多添加一个就行了
 file, err2 := ctx.FormFile("myGoodsImg2")
    if err2 != nil {
        ctx.JSON(http.StatusInternalServerError, gin.H{ "message": err.Error(), })

多文件上传--相同同名字的多个文件

 <input type="file" name="myGoodsImg[]" id="uploadfile" multiple>
func (c UserController) MuchAddFile(ctx *gin.Context) {
        // Multipart form
    form, _ := ctx.MultipartForm()
    files := form.File["myGoodsImg[]"]
    // var dst;
    for _, file := range files { //使用for循环将files循环出来
    // 上传文件至指定目录
        dst := path.Join("./static/upload", file.Filename)
        ctx.SaveUploadedFile(file, dst)
}
    ctx.JSON(http.StatusOK, gin.H{ "message": "文件上传成功", 
    })
}

按照日期存储

//判断文件格式

 if err1 == nil {
//2、获取后缀名 判断类型是否正确 .jpg .png .gif .jpeg
extName := path.Ext(file.Filename)
allowExtMap := map[string]bool{
    ".jpg": true, 
    ".png": true, 
    ".gif": true,
    ".jpeg": true, }
    
    //做出提示
    if _, ok := allowExtMap[extName]; !ok {
    ctx.String(200, "文件类型不合法")
    return
}

//3、创建图片保存目录 
    day := models.GetDay()            //使用公共模板方法
    dir := "./static/upload/" + day  //使用时间做路径
if err := os.MkdirAll(dir, 0666); err != nil {
    log.Error(err)
}
//4、生成文件名称  
fileUnixName := strconv.FormatInt(models.GetUnix(), 10)
//5、保存文件到该路径
saveDir := path.Join(dir, fileUnixName+extName)
ctx.SaveUploadedFile(file, saveDir)
}