Gin 的文件上传

509 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

gin 文件上传

注意:需要在上传文件的 form 表单上面需要加入 enctype="multipart/form-data"

一、单文件上传

1、定义模板

例如:

<form method="post" action="/" enctype="multipart/form-data"> 

<div class="input-file-box">
    <span>点击上传图片</span>
    <input type="file" name="myGoodsImg" id="uploadfile" multiple> //name属性提供给后端接口
</div>
 <button type="submit" id="ensure">确认上传</button>

</form>

注意:在真实的项目中,我们需要定义模板!!!{{define 模板名}} html {{end}}

2、定义业务逻辑

func (c UserController) FileUp(ctx *gin.Context) {

    file, err := ctx.FormFile("myGoodsImg")
    if err != nil {
        ctx.JSON(http.StatusInternalServerError, gin.H{ "message": err.Error(), })
    return
}
// 上传文件到指定的目录
dst := path.Join("./static/upload", file.Filename)
fmt.Println(dst)
ctx.SaveUploadedFile(file, dst)
ctx.JSON(http.StatusOK, gin.H{ "message": fmt.Sprintf("'%s' fileUpSucc!", file.Filename), })
}

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

1、定义模板

<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>

2、定义业务逻辑

//只需要多添加一个就行了
 file, err2 := ctx.FormFile("myGoodsImg2")
    if err2 != nil {
        ctx.JSON(http.StatusInternalServerError, gin.H{ "message": err.Error(), })

注意:但是我们一般上传文件都是一个按钮然后选择多文件一键提交上传,因此,我们应该学会多文件上传--相同名字的多个文件

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

1、定义模板

在单文件上传的模板上的input改成下面这行代码:

 <input type="file" name="myGoodsImg[]" id="uploadfile" multiple>

2、定义业务逻辑

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": "文件上传成功", 
    })
}

注意:在一个项目中,上传的文件非常多,并且需要判断文件是否是我们需要的格式。所以我们需要根据时间来分类。

四、文件上传 按照日期存储

1、定义模板

多文件上传--相同同名字的多个文件的模板一样

2、定义业务逻辑(与相同同名字的多个文件类似)

下面只写不一样的和增加的

//判断文件格式

 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)
}