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 26 Golang
Go语言中的UTF-8实现
Apr 26 Golang
goland 设置project gopath的操作
May 06 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Golang实现可重入锁的示例代码
May 25 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 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
如何开始收听短波广播
2021/03/01 无线电
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
简单的js分页脚本
2009/05/21 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
js 小数取整的函数
2010/05/10 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
three.js 入门案例详解
2018/01/23 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
js面向对象方式实现拖拽效果
2021/03/03 Javascript
对Python实现累加函数的方法详解
2019/01/23 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
母亲七十大寿答谢词
2014/01/18 职场文书
广告设计应届生求职信
2014/03/01 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python