单文件上传

cat index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 上传文件要用 form 标签的 enctype="multipart/form-data" 属性, 表明二进制上传-->
<form action="/upload" method="post" enctype="multipart/form-data">
<div>
<label for="up">选择文件: </label>
<input type="file" name="f1" id="up">
<br>
<input type="submit" value="点击上传">
</div>
</form>
</body>
</html>

后端 demo

package main

import (
"github.com/gin-gonic/gin"
"net/http"
"path"
) func main() {
r := gin.Default()
r.LoadHTMLFiles("index.html")
r.GET("index", func(c *gin.Context) {
c.HTML(http.StatusOK,"index.html",nil)
}) r.POST("/upload", func(c *gin.Context) {
// 1. 接收前端上传文件
// gin 内置了 FormFile 方法来接收前端上传的文件 // 处理 HTML multipart forms 提交文件时默认的内存限制是32 MiB
// 可以通过下面的方式修改
// router.MaxMultipartMemory = 8 << 20 // 8 MiB
f,err := c.FormFile("f1")
if err != nil {
c.JSON(http.StatusInternalServerError,gin.H{
"msg": err.Error(),
})
} else {
// 2. 保存文件到服务端
// filePath := fmt.Sprintf("./%s",f.Filename) //
filePath := path.Join("./",f.Filename) // path 标准库
// gin 内置了 SaveUploadedFile 方法来保存前端上传的文件
c.SaveUploadedFile(f,filePath)
c.JSON(http.StatusOK,gin.H{
"msg": "ok!",
})
}
}) r.Run(":9090") }

多文件上传

有时候需要一次上传多个文件,gin 也提供了相应的模块,来接收多个文件。然后 for 循环遍历上传。

前端:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 上传文件要用 form 标签的 enctype="multipart/form-data" 属性, 表明二进制上传-->
<form action="/uploads" method="post" enctype="multipart/form-data">
<div>
<label for="up">选择文件: </label>
<!-- 多文件上传时 input 标签要使用 multiple="multiple" 属性 -->
<input type="file" name="f1" id="up" multiple="multiple">
<br>
<input type="submit" value="点击上传">
</div>
</form>
</body>
</html>

多文件上传后端 demo

package main

import (
"github.com/gin-gonic/gin"
"net/http"
"path"
) func main() {
r := gin.Default()
r.LoadHTMLFiles("index.html")
r.GET("index", func(c *gin.Context) {
c.HTML(http.StatusOK,"index.html",nil)
}) r.POST("/uploads", func(c *gin.Context) {
// gin 多文件上传 MultipartForm 方法读取多个文件
form, err := c.MultipartForm()
if err != nil {
c.JSON(http.StatusInternalServerError,gin.H{
"msg": err.Error(),
})
}
// File 方法,把前端选中的多个文件放到 一个 map 类型里
files := form.File["file"] // range 遍历 map, for 循环上传
for _,file := range files{
dst := path.Join("./", file.Filename)
//dst := fmt.Sprintf("./%s_%d", file.Filename)
c.SaveUploadedFile(file,dst)
}
}) r.Run(":9090") }

最新文章

  1. codeforces A. Difference Row
  2. paip.一千 常用汉字 高频汉字 覆盖率90%
  3. 配置JDK和TOMCAT
  4. poj2242
  5. ASP.NET MVC 项目直接预览PDF文件
  6. Linux工具之bc计算器进制的转换
  7. sublimeText3使用记录
  8. ArcGis恢复初始设置(默认设置、出厂设置)的方法
  9. Linux配置虚拟内存
  10. 二.第一个自动化demo,打开APP-如何获取包名和activity。(真机)
  11. 【WebSocket No.3】使用WebSocket协议来做服务器
  12. css3渐变 两边透明中间高亮
  13. linux命令清除服务器缓存
  14. Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口
  15. 在ANTMINER(阉割版BeagleBone Black)运行Debain
  16. Siki_Unity_3-3_背包系统
  17. shell学习1---基本的shell命令
  18. InputStream转化为String
  19. php中上传图片
  20. Last Position of Target

热门文章

  1. SQL注入的原理及一般步骤
  2. netty系列之:JVM中的Reference count原来netty中也有
  3. 动手写一个LRU缓存
  4. 《PHP程序员面试笔试宝典》——如何回答算法设计问题?
  5. c++ 程序编译后运行时的内存分配
  6. Spring Boot自动配置SpringMVC(一)
  7. QQ表情代码大全,你知道几个??
  8. Android SugarORM(3)
  9. [题解]UVA10986 Sending email
  10. vs2022 如何让.net库文件参与程序调试【可以.net库文件的源代码中设置断点,单步跟踪】