首页 > 其他分享 >go 单文件上传,多文件上传

go 单文件上传,多文件上传

时间:2023-04-12 23:11:07浏览次数:34  
标签:文件 ok upload return gin go router 上传

单文件上传示例:

 main.go

router := router.InitRouter()

router.Run()

 

router/router.go

var router = gin.Default()

func init() {
    //加载自定义函数
    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        v.RegisterValidation("capt", captcha.VerifyCaptcha)
    }

//加载静态文件
    router.Static("upload", "upload/")
    //加载view
    router.LoadHTMLGlob("view/*")
}

func InitRouter() *gin.Engine {
    router.GET("/index", user.Index) 
    router.POST("/upload", upload.Upload)
    return router
}

 

controller/user/index.go

func Index(c *gin.Context) {
    c.HTML(http.StatusOK, "upload.html", nil)
}

 

 common/upload/upload.go代码如下:

 

// 定义上传路径
const UPLOAD_DIR = "upload"

func Upload(c *gin.Context) {
    file, err := c.FormFile("upfile")
    if err != nil {
        c.JSON(http.StatusForbidden, gin.H{
            "code":  400,
            "error": err.Error(),
        })
        return
    }

    arr := strings.Split(file.Filename, ".")
    filepath, ok := checkExtAndgetFilePath(arr[1])
    if ok != true {
        c.JSON(http.StatusForbidden, gin.H{
            "code":  400,
            "error": "invalid ext",
        })
        return
    }

    if err = c.SaveUploadedFile(file, filepath); err != nil {
        c.JSON(http.StatusForbidden, gin.H{
            "code":  400,
            "error": "upload failed",
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "code":    200,
        "error":   "upload success",
        "img_url": filepath,
    })
    return
}

// 检查扩展名,并返回文件路径
func checkExtAndgetFilePath(fileExt string) (string, bool) {
    allowExt := map[string]bool{
        "jpg":  true,
        "png":  true,
        "jpeg": true,
    }
    if _, ok := allowExt[fileExt]; !ok {
        return "", false
    }
    //创建文件夹
    if _, ok := os.Stat(UPLOAD_DIR); ok != nil {
        os.Mkdir(UPLOAD_DIR, os.ModePerm)
    }
    filePath := UPLOAD_DIR + "/" + strconv.FormatInt(time.Now().Unix(), 10) + "." + fileExt
    return filePath, true
}

 

 

view/upload.html 模板文件

<body>
<h3>单文件上传</h3>
<form action="/upload" method="post" enctype="multipart/form-data">
   <p><input type="file" name="upfile" id="upfile" /> <input type="submit" value="上传" /></p>
</form>
</body>

 

 

上传成功后返回:

 

 

 

多文件上传示例:

router/router.go

 

var router = gin.Default()

func init() {
    //加载自定义函数
    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        v.RegisterValidation("capt", captcha.VerifyCaptcha)
    }
    //加载静态文件
    router.Static("upload", "upload/")

    //加载view
    router.LoadHTMLGlob("view/*")
}

func InitRouter() *gin.Engine {
    router.GET("/index", user.Index)
    router.POST("/upload", upload.UploadMul)
    return router
}

 

common/upload.go

// 定义上传路径
const UPLOAD_DIR = "upload"
func UploadMul(c *gin.Context) {
    form, err := c.MultipartForm()
    if err != nil {
        c.JSON(http.StatusForbidden, gin.H{
            "code":  400,
            "error": err.Error(),
        })
        return
    }
    var urls []string
    files := form.File["upfile"]
    for _, file := range files {
        arr := strings.Split(file.Filename, ".")
        filepath, ok := checkExtAndgetFilePath(arr[1])
        if ok != true {
            c.JSON(http.StatusForbidden, gin.H{
                "code":  400,
                "error": "invalid ext",
            })
            return
        }

        if err = c.SaveUploadedFile(file, filepath); err != nil {
            c.JSON(http.StatusForbidden, gin.H{
                "code":  400,
                "error": "upload failed",
            })
            return
        }
        urls = append(urls, filepath)
    }

    c.JSON(http.StatusOK, gin.H{
        "code":    200,
        "error":   "upload success",
        "img_url": urls,
    })
    return
}

// 检查扩展名,并返回文件路径
func checkExtAndgetFilePath(fileExt string) (string, bool) {
    allowExt := map[string]bool{
        "jpg":  true,
        "png":  true,
        "jpeg": true,
    }
    if _, ok := allowExt[fileExt]; !ok {
        return "", false
    }
    //创建文件夹
    if _, ok := os.Stat(UPLOAD_DIR); ok != nil {
        os.Mkdir(UPLOAD_DIR, os.ModePerm)
    }
    filePath := UPLOAD_DIR + "/" + strconv.FormatInt(time.Now().UnixNano(), 10) + "." + fileExt
    return filePath, true
}

view/upload.html

<body>
<h3>单文件上传</h3>
<form action="/upload" method="post" enctype="multipart/form-data">
    <p><input type="file" name="upfile" multiple id="upfile" /> <input type="submit" value="上传" /></p>
</form>
</body>

其他文件跟单文件上传一致。

 

上传的时候按住ctrl,可选择多张图片,上传后效果:

 

 

上传后,需要静态文件显示的话,在路由中需要增加一行代码:

router.Static("upload", "upload/") //加载静态文件

不然,通过浏览器无法打开图片

 

完结

 

标签:文件,ok,upload,return,gin,go,router,上传
From: https://www.cnblogs.com/ypeih/p/17311747.html

相关文章

  • mongoDB查询优化《一》
    同事反馈线上一个查询非常慢(10秒+),具体如下:1.问题语句db.myColl.find({app:"my_app",requestTime:{$gte:1492502247000,$lt:1492588800000}}).sort({_id:-1}).limit(1)表记录如下:{"app":"my_app","eventId":141761066,"requestTime":Numb......
  • IDL编程语言的代码,打开文件、读文件、写文件
    proread_write_file,filename,output_filename;打开输入文件openr,1,filename,/get_lun;读取文件内容content=''while(noteof(1))dobeginline=''readf,1,linecontent=strjoin([content,line......
  • Lecture#10 Sorting & Aggregation Algorithms
    接下来将学习使用我们现在学习的DBMS组件来执行查询。我们今天要讨论的算法都是基于Disk的,即查询的中间结果也需要存储到磁盘中。我们需要使用BufferPool去实现这些算法,要最大化磁盘连续I/O。QueryPlan:算子组织成树形结构,数据从叶子节点流向根节点,根节点的输出就是查......
  • 打印出目录下所有文件名(给出 C、Bash两个版本)
    bashfunctionfl(){if[[-z"$1"]];thenfl_read_dir$PWDelif[["${1:-1}"=='/']];thenfl${1%/}elsefl_read_dir$1fi}functionfl_read_dir(){forfilein`ls-a$1`......
  • Golang一日一库之 日志库 zap
    简介在开发过程中会使用到日志库去记录错误的日志,尤其是golang中有无穷无尽的error如果不记录,当你的代码出错,就无从排错了。zap是开源的Go高性能日志库主要有以下特点:支持不同的日志级别能够打印基本信息等但不支持日志的分割但是可以使用lumberjack也是zap官方......
  • Go sync.Once:简约而不简单的并发利器
    原创文章,如需转载请联系作者:陈明勇公众号:Go技术干货简介在某些场景下,我们需要初始化一些资源,例如单例对象、配置等。实现资源的初始化有多种方法,如定义package级别的变量、在init函数中进行初始化,或者在main函数中进行初始化。这三种方式都能确保并发安全,并在程序启动......
  • 统一的文件管理,团队轻松协作
    目前IT行业大都采用项目经理制的管理方式,这种管理方式下各个部门间相互独立,同时各部门间也缺乏沟通协作。因此IT行业在文件管理上主要面临以下几个问题:文档缺乏集中管理:企业在管理过程中产生的大量文件分散在各个部门中,散落在不同员工的设备中。文件查找使用不便:因文件没有统一管理......
  • 面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
    转载请注明出处:1.最大可以创建多少个tcp连接服务器最大可以创建多少个TCP连接取决于多个因素,例如服务器的硬件配置、网络带宽、操作系统设置等。一般来说,现代服务器的硬件资源和网络带宽都比较充足,因此可以创建大量的TCP连接。然而,服务器在创建TCP连接时也会有一些限制......
  • C++文件处理
    ......
  • 操作系统-文件存储空间(外存)管理
    存储空间的划分和初始化>一般一个文件存放在一个文件卷中。文件卷在提供服务之前,必须由对应的文件程序进行初始化,划分好目录区和文件区,建立空闲空间管理表格以及存放文件卷信息的超级块。1.空闲表法2.空闲链表法3.位示图法4.成组链接法这块天勤讲的好https://www.b......