亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go Gin實現(xiàn)文件上傳下載的示例代碼

 更新時間:2021年04月02日 10:16:52   作者:我是不會贏的  
這篇文章主要介紹了Go Gin實現(xiàn)文件上傳下載的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Go Gin 實現(xiàn)文件的上傳下載流讀取

文件上傳

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
 }
 //目錄請求參數(shù)為空
 if common.IsEmpty(saveDirParam) {
   c.JSON(http.StatusOK, gin.H{
     "success": false,
     "message": "請求參數(shù)錯誤!",
     "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() {
   //創(chuàng)建目錄
   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": "創(chuàng)建目錄失敗",
     })
     return
   }
 }
 ////上傳文件前 先刪除該資源之前上傳過的資源文件
 ////(編輯-重新選擇文件-需要先刪除該資源之前上傳過的資源文件)
  ////該代碼執(zhí)行的條件----上傳的名稱是唯一的,否則會出現(xiàn)誤刪
 ////獲取文件的前綴
 //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, //是否需要安全協(xié)議,一般設置為false
        fileElementId: fileUploadDomId, //文件上傳域的ID
        data: {
          "saveDir":fileSaveDir,
          "fileName":fileSaveName
        },
        dataType: 'json', //返回值類型 一般設置為json
        contentType:'application/json',//提交的數(shù)據(jù)類型
        async: false,
        success: function (data, status) //服務器成功響應處理函數(shù)
        {
          if (data.success){
            fileSaveName=fileSaveDir+"/"+data.name;
            console.log("上傳成功,返回的文件的路徑:",fileSaveName)
          }else{
            console.log("上傳失敗,返回的文件的路徑:",fileSaveName)
            return
          }
        },
        error: function (data, status, e)//服務器響應失敗處理函數(shù)
        {
          console.log("e==",e);
          return
        }
      }
    );

文件的下載

router

Type:‘GET'

普通鏈接格式非restful風格

參數(shù)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

//下載次數(shù)
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風格

參數(shù)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",
}

//根據(jù)文件路徑讀取返回流文件 參數(shù)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實現(xiàn)文件上傳下載的示例代碼的文章就介紹到這了,更多相關Go Gin 文件上傳下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • go實現(xiàn)一個內存緩存系統(tǒng)的示例代碼

    go實現(xiàn)一個內存緩存系統(tǒng)的示例代碼

    本文主要介紹了go實現(xiàn)一個內存緩存系統(tǒng)的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • 詳解Go語言中io/ioutil工具的使用

    詳解Go語言中io/ioutil工具的使用

    這篇文章主要為大家詳細介紹了Go語言中io/ioutil工具的使用,從而簡化文件操作。文中是示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-05-05
  • Go語言中日志的規(guī)范使用建議分享

    Go語言中日志的規(guī)范使用建議分享

    在任何服務端的語言項目中,日志是至關重要的組成部分,本文為大家整理了一些如何規(guī)范使用GO語言日志的建議,以及相應的實際示例,希望對大家有事幫助
    2024-01-01
  • Golang使用Swag搭建api文檔的全過程

    Golang使用Swag搭建api文檔的全過程

    Gin是Golang目前最為常用的Web框架之一,公司項目驗收需要API接口設計說明書(Golang后端服務基于Gin框架編寫),所以本文給大家介紹了Golang使用Swag搭建api文檔的全過程,需要的朋友可以參考下
    2024-02-02
  • go?defer延遲調用的使用場景示例詳解

    go?defer延遲調用的使用場景示例詳解

    這篇文章主要為大家介紹了go?defer延遲調用的使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現(xiàn)

    Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現(xiàn)

    這篇文章主要介紹了Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 在go語言中安裝與使用protobuf的方法詳解

    在go語言中安裝與使用protobuf的方法詳解

    protobuf以前只支持C++, Python和Java等語言, Go語言出來后, 作為親兒子, 那有不支持的道理呢? 這篇文章主要給大家介紹了關于在go語言中使用protobuf的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • golang反向代理設置host不生效的問題解決

    golang反向代理設置host不生效的問題解決

    在使用golang的httputil做反向代理的時候,發(fā)現(xiàn)一個奇怪的現(xiàn)象,上游網關必須要設置host才行,不設置host的話,golang服務反向代理請求下游會出現(xiàn)http 503錯誤,接下來通過本文給大家介紹golang反向代理設置host不生效問題,感興趣的朋友一起看看吧
    2023-05-05
  • Golang slice切片操作之切片的追加、刪除、插入等

    Golang slice切片操作之切片的追加、刪除、插入等

    這篇文章主要介紹了Golang slice切片操作之切片的追加、刪除、插入等,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 利用Go語言實現(xiàn)Raft日志同步

    利用Go語言實現(xiàn)Raft日志同步

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)Raft日志同步,文中的示例代碼講解詳細,對我們深入了解Go語言有一定的幫助,需要的可以參考一下
    2023-05-05

最新評論