Go Gin實現文件上傳下載的示例代碼
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 文件上傳下載內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- None Found