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 相关文章推荐
用golang如何替换某个文件中的字符串
Apr 25 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Golang map映射的用法
Apr 22 Golang
Go web入门Go pongo2模板引擎
May 20 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
论建造顺序的重要性
2020/03/04 星际争霸
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
PHP防盗链代码实例
2014/08/27 PHP
php实现zip文件解压操作
2015/11/03 PHP
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
解决Mac node版本升级失败的问题
2018/05/16 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
python多线程编程方式分析示例详解
2013/12/06 Python
wxPython中文教程入门实例
2014/06/09 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python判断有效的数独算法示例
2019/02/23 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
制药工程专业毕业生推荐信
2013/12/24 职场文书
青年创业培训欢迎词
2014/01/08 职场文书
业务总经理岗位职责
2014/02/03 职场文书
网络书店创业计划书
2014/02/07 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
投标文件签署授权委托书范本
2014/10/12 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
学会感恩主题班会
2015/08/12 职场文书
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
MySQL连接控制插件介绍
2021/09/25 MySQL