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 28 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang 实现Location跳转方式
May 02 Golang
go类型转换及与C的类型转换方式
May 05 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
浅析PHP的静态成员函数效率更高的原因
2014/06/13 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
Django celery异步任务实现代码示例
2020/11/26 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
赔偿协议书范本
2014/04/15 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
学生通报表扬范文
2015/05/04 职场文书
python pygame入门教程
2021/06/01 Python
python实现简单的三子棋游戏
2022/04/28 Python