Gin 08 上传文件
单文件上传
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")
}
Gin 08 上传文件的更多相关文章
- golang 上传文件(包括 gin 实现)
golang web服务有时候需要提供上传文件的接口,以下就是具体示例.为了示例简单(吐槽下 golang 的错误处理), 忽略了所有的错误处理.本文会用两种方式(标准库和gin)详细讲解 golan ...
- ASP.NET、JAVA跨服务器远程上传文件(图片)的相关解决方案整合
一.图片提交例: A端--提交图片 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string u ...
- 记一次FTP上传文件总是超时的解决过程
好久没写博,还是重拾记录一下吧. 背景:买了一个阿里云的云虚拟机用来搭建网站(起初不了解云虚拟主机和云服务器的区别,以为都是有SSH功能的,后来发现不是这样样子啊,云虚拟机就是FTP上传网页+MySQ ...
- WebView 上传文件 WebChromeClient之openFileChooser函数
原链接:http://blog.saymagic.cn/2015/11/08/webview-upload.html?utm_source=tuicool&utm_medium=referra ...
- CXF:通过WebService上传文件,包括大文件的处理
参考网上文章,用CXF发布上传文件接口,并上传大文件的测试. 框架:spring3.1+cxf2.7.6 1.定义文件类实体 import javax.activation.DataHandler; ...
- Java 上传文件到 SFTP 抛异常 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 的解决办法
最近从 Op 那里报来一个问题,说是SFTP上传文件不成功.拿到的 Exception 如下: Caused by: java.lang.NoClassDefFoundError: Could not ...
- WP8_(windows phone环境下)上传文件从C#到php接口
在windows phone环境下,将手机上的图片上传到服务端(php环境): 注意事项:在上传的地方,头文件中name,例如name= img,则在php服务端处理时 ,需要约定好 存取一致 php ...
- winform 上传文件
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO ...
- github上传文件
说来也惭愧,我是最近开始用github,小白一个,昨天研究了一个下午.终于可以上传了,所以今天写点,一来分享是自己的一些经验,二来也是做个记录,万一哪天又不记得了:) 废话不多说,直接来,这次主要介绍 ...
随机推荐
- Swift 学习网址精选 By HL
虽然目前iOS大部分的项目开发语言用的不是Swift,但随着Swift的不断强大,取代Objective-C 指日可待,所以学习Swift是十分必要的.但毕竟是亲儿子,目前只有Foundation被翻 ...
- Nginx网站服务 配置
Nginx网站服务 配置 1.编译安装Nginx服务 2.认识Nginx服务的主配置文件nginx.conf 3.访问状态统计配置 4.基于授权的访问控制 5.基于客户端的访问控制 6.基于域名的Ng ...
- 洛谷P1563 [NOIP2016 提高组] 玩具谜题
题目链接:https://www.luogu.com.cn/problem/P1563 哈哈哈,这个题拿来一读是不是很吃惊hahaha,我刚开始读的时候吓了我一跳,这么长的题干,这么绕的题意,还有下面 ...
- JS IndexOf移除符合规则的一项
RemoveItem: function (val) { var index = selectedUsers.indexOf(val); if (index > -1) { selectedUs ...
- 深入Java微服务之网关系列1:什么是网关
前言 近来,在想着重构一个新的产品.准备采用微服务的技术解决方案,来搭建基础设施框架.网关,是一个必不可少的组件.那么,网关到底是什么? 其又有什么特点或者特性,成为微服务必不可少的组件呢?今天, ...
- C#字符串Unicode转义序列编解码
C#字符串Unicode转义序列编解码 在开发过程中时常会遇到"\Uxxxx"格式表示的字符,实际上"xxxx"是字符的Unicode码的十六进制表示方式.这种 ...
- MyBatis辅助功能点三:延迟加载
延迟加载即先加载必需信息,然后再根据需要进一步加载信息的方式.实际应用如:常出现先查询表A,再根据表A的输出结果查询表B的情况.而有些时候,从A表查询出来的数据,只有一部分要查询表B.这时用延迟加载就 ...
- Centos下Ambari2.7.5的编译和安装
前言 终于,要开始写点大数据相关的文章了.当真的要开始写老本行的时候,还是考虑了挺久的.一是不知道从何处写起,二是如何能写点有意思的. 我们常说,过程比结果重要.也是有很多人喜欢准备完全之后,才会开始 ...
- 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选
Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...
- [题解]UVA658 It's not a Bug, it's a Feature!
链接:http://vjudge.net/problem/viewProblem.action?id=22169 描述:有n个漏洞,m个修复漏洞的方法,每种方法耗时不一样,求修复漏洞的最短时间.每种方 ...