Go Gin实现文件上传下载的示例代码


Posted in Golang onApril 02, 2021

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

到此这篇关于Go Gin实现文件上传下载的示例代码的文章就介绍到这了,更多相关Go Gin 文件上传下载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Golang 相关文章推荐
Go语言操作数据库及其常规操作的示例代码
Apr 21 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Go 语言结构实例分析
Jul 04 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang 遍历二叉树
Apr 19 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Go各时间字符串使用解析
Apr 02 #Golang
一文读懂go中semaphore(信号量)源码
Apr 03 #Golang
go语言map与string的相互转换的实现
Apr 07 #Golang
Golang二维切片初始化的实现
Apr 08 #Golang
为什么不建议在go项目中使用init()
Apr 12 #Golang
Go语言操作数据库及其常规操作的示例代码
Apr 21 #Golang
golang判断key是否在map中的代码
Apr 24 #Golang
You might like
php 常用字符串函数总结
2008/03/15 PHP
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
zend framework多模块多布局配置
2011/02/26 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
微信小程序实现圆形进度条动画
2020/11/18 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
python中的json总结
2018/10/11 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
django创建简单的页面响应实例教程
2019/09/06 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
8种常用的Python工具
2020/08/05 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
委托书怎样写
2014/08/30 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
开展警示教育活动总结
2015/05/09 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
Rust中的Struct使用示例详解
2022/08/14 Javascript