Go Gin实现文件上传下载的示例代码
作者:我是不会赢的 发布时间:2023-06-21 15:11:13
标签:Go,Gin,上传,下载
Go Gin 实现文件的上传下载流读取
文件上传
router
router.POST("/resources/common/upload", service.UploadResource)
service
type: POST
data:{
“saveDir”:“保存的路径”,
“fileName”:“文件名称不带后缀”
}
// 上传文件
func UploadResource(c *gin.Context) {
saveDirParam := c.PostForm("saveDir") // 文件目录
fileNameParam := c.PostForm("fileName") // 文件名称
//目录
var saveDir = ""
//名称
var saveName = ""
//完整路径
var savePath = ""
//获取文件
file, header, errFile := c.Request.FormFile("file")
//处理获取文件错误
if errFile != nil || common.IsEmpty(header.Filename) {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "请选择文件",
"dir": saveDir,
"name": saveName,
"path": savePath,
})
return
}
//目录请求参数为空
if common.IsEmpty(saveDirParam) {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "请求参数错误!",
"dir": saveDir,
"name": saveName,
"path": savePath,
})
return
}
//如果上传的名称为空,则自动生成名称
if common.IsEmpty(fileNameParam) {
fileNameParam = GenerateResourceNo()
}
//获取上传文件的后缀(类型)
uploadFileNameWithSuffix := path.Base(header.Filename)
uploadFileType := path.Ext(uploadFileNameWithSuffix)
//文件保存目录
saveDir = "/attachment" + saveDirParam
//保存的文件名称
saveName = fileNameParam + uploadFileType
savePath = saveDir + "/" + saveName
//打开目录
localFileInfo, fileStatErr := os.Stat(saveDir)
//目录不存在
if fileStatErr != nil || !localFileInfo.IsDir() {
//创建目录
errByMkdirAllDir := os.MkdirAll(saveDir, 0755)
if errByMkdirAllDir != nil {
logs.Error("%s mkdir error.....", saveDir, errByMkdirAllDir.Error())
c.JSON(http.StatusOK, gin.H{
"success": false,
"dir": saveDir,
"name": saveName,
"path": savePath,
"message": "创建目录失败",
})
return
}
}
////上传文件前 先删除该资源之前上传过的资源文件
////(编辑-重新选择文件-需要先删除该资源之前上传过的资源文件)
////该代码执行的条件----上传的名称是唯一的,否则会出现误删
////获取文件的前缀
//fileNameOnly := fileNameParam
//deleteFileWithName(fileNameOnly, saveDir)
//deleteFileWithName(fileNameOnly, model.WebConfig.ResourcePath+"/"+
// model.WebConfig.WebConvertToPath)
out, err := os.Create(savePath)
if err != nil {
logs.Error(err)
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"dir": saveDir,
"name": saveName,
"path": savePath,
"message": err.Error(),
})
return
}
//没有错误的情况下
c.JSON(http.StatusOK, gin.H{
"success": true,
"dir": saveDir,
"name": saveName,
"path": savePath,
"message": "上传成功",
})
return
}
js提交例子:
注:需导入jquery.js 和 ajaxfileupload.js
//上传文件
$.ajaxFileUpload(
{
url: '/resources/common/upload', //用于文件上传的服务器端请求地址
secureuri: false, //是否需要安全协议,一般设置为false
fileElementId: fileUploadDomId, //文件上传域的ID
data: {
"saveDir":fileSaveDir,
"fileName":fileSaveName
},
dataType: 'json', //返回值类型 一般设置为json
contentType:'application/json',//提交的数据类型
async: false,
success: function (data, status) //服务器成功响应处理函数
{
if (data.success){
fileSaveName=fileSaveDir+"/"+data.name;
console.log("上传成功,返回的文件的路径:",fileSaveName)
}else{
console.log("上传失败,返回的文件的路径:",fileSaveName)
return
}
},
error: function (data, status, e)//服务器响应失败处理函数
{
console.log("e==",e);
return
}
}
);
文件的下载
router
Type:‘GET'
普通链接格式非restful风格
参数url:下载的文件的路径
Jquery解码:decodeURIComponent(url);
Jquery编码:encodeURIComponent(url);
例:http://127.0.0.0.1:8080//pub/common/download?url=“/attachment/demo.docx”
router.GET("/pub/common/download", service.PubResFileStreamGetService)
service
//下载次数
func UserFileDownloadCommonService(c *gin.Context) {
filePath := c.Query("url")
//打开文件
fileTmp, errByOpenFile := os.Open(filePath)
defer fileTmp.Close()
//获取文件的名称
fileName:=path.Base(filePath)
if common.IsEmpty(filePath) || common.IsEmpty(fileName) || errByOpenFile != nil {
logs.Error("获取文件失败")
c.Redirect(http.StatusFound, "/404")
return
}
c.Header("Content-Type", "application/octet-stream")
//强制浏览器下载
c.Header("Content-Disposition", "attachment; filename="+fileName)
//浏览器下载或预览
c.Header("Content-Disposition", "inline;filename="+fileName)
c.Header("Content-Transfer-Encoding", "binary")
c.Header("Cache-Control", "no-cache")
c.File(filePath)
return
}
文件流读取
router
Type:‘GET'
普通链接格式非restful风格
参数url:下载的文件的路径
Jquery解码:decodeURIComponent(url);
Jquery编码:encodeURIComponent(url);
例:http://127.0.0.0.1:8080//pub/common/file_stream?url=“/attachment/demo.docx”
router.GET("/pub/common/file_stream", service.PubResFileStreamGetService)
service
//map for Http Content-Type Http 文件类型对应的content-Type
var HttpContentType = map[string]string{
".avi": "video/avi",
".mp3": " audio/mp3",
".mp4": "video/mp4",
".wmv": " video/x-ms-wmv",
".asf": "video/x-ms-asf",
".rm": "application/vnd.rn-realmedia",
".rmvb": "application/vnd.rn-realmedia-vbr",
".mov": "video/quicktime",
".m4v": "video/mp4",
".flv": "video/x-flv",
".jpg": "image/jpeg",
".png": "image/png",
}
//根据文件路径读取返回流文件 参数url
func PubResFileStreamGetService(c *gin.Context) {
filePath := c.Query("url")
//获取文件名称带后缀
fileNameWithSuffix := path.Base(filePath)
//获取文件的后缀
fileType := path.Ext(fileNameWithSuffix)
//获取文件类型对应的http ContentType 类型
fileContentType := HttpContentType[fileType]
if common.IsEmpty(fileContentType) {
c.String(http.StatusNotFound, "file http contentType not found")
return
}
c.Header("Content-Type", fileContentType)
c.File(filePath)
}
来源:https://www.jianshu.com/p/6be52e15e432
0
投稿
猜你喜欢
- ------谁正在访问数据库?Select c.sid, c.serial#,c.username,a.object_id,b.
- 这几天刚刚做了这个东西,有网友问到,所以分享一下。ie6、firefox2 通过,麻烦有ie7的网友测试一下,由于有其他代码,剖析出来麻烦,
- 在已经发表的系列文章中我们已经讨论了两个ASP对象:Application对象和Session对象,因此能够访问Application对象和
- 为了庆祝jQuery的四周岁生日, jQuery的团队荣幸的发布了jQuery Javascript库的最新主要版本! 这个版本包含了大量的
- 比如:我们导入了某个客户的资料,我们知道此客户的姓名是ZhangShan,我们想知道,在我们的业务数据库(eg:NorthWind)中,有哪
- 最近发现数据库服务器压力很大,CPU经常达到100%。查看进程,发现有大量的sp_cursorclose;1进程信息。网上查了下,出现sp_
- 这个仿msn的右下角popup提示窗口效果很久以前收集的,现在整理出来给大家分享,需要的朋友可以拿去用,特点,提示窗口内容和js代码分离容易
- 索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。在数据库表中,对字段建立
- 这一段时间,我在进行“09帮助中心升级”项目,负责其中的白板和视觉设计,总算和Axure有了第一次的正式会晤。由于之前已经零散地学习过一些A
- 当浏览网页时,总有那么一类网站华丽而富有趣味性。在浏览信息的同时,足够让我们眼前一亮。它们在充分融入动画、视频、游戏、甚至是与众不同的交互操
- 方法不是主流的。有一组数据,大概10万个左右,每一单位的值不会大于30000,要求按照由大到小的顺序不重复输出。参考无忧cosin的方法后(
- 使用jmail组件发送邮件:Function JMail(Send_From,Send_To,Send_Subject,Send_
- WinHttp; // Microsoft WinHTTP Services, version 5.1Alias HTTPREQUEST_P
- 如何让用户也能修改密码? 好了,照下面添加到你要添加的地方去:<%id = Request(&qu
- 前几天有个人退群了。起因很简单,他问了一个问题,没人回答,于是说要退群,后来我看到了,给了个链接,说这个问题已经说过好多遍了,于是他就退了。
- 在默认情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE
- 最好也是最简单的办法就是利用Cookie,而不必用到数据库。当然,你愿意用数据库也可以。下面就是利用Cookie来实现的:< 
- 有。试试下面这个程序:saveip.asp<%Server.Scripttimeout = 1000On 
- 本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义,
- 在本机运行含有JavaScript代码的网页时(比如Google AD代码),IE浏览器会产生一个警告。这个“警告”确实很烦人,开始时还会误