golang gin download and upload file

func main() {
    router := gin.Default()

    router.GET("/api/v1/attachments/:file",DownloadAttachmentHandler)
    router.POST("/api/v1/attachment/files", UploadAttachmentFileHandler)

    // Listen and serve on 0.0.0.0:8080
    r.Run(":8080")
}
// UploadAttachmentFileHandler ...
func UploadAttachmentFileHandler(c *gin.Context) {
	//文件後綴
	fileSuffix := ""
	//文件路徑
	fileDir := "./data"  //文件上傳保存的路徑eg:./data
	//文件全名
	fileName := ""
	formdata, err := c.MultipartForm()
	if err != nil {
		c.JSON(http.StatusOK, HTTPGenericResponse{
			Code:    http.StatusInternalServerError,
			Message: "文件讀取失敗:" + err.Error(),
		})
		return
	}
	fileHeaders := formdata.File["file"]
	attachs := ""
	name := ""
	for index, fileHeader := range fileHeaders {
		file, err := fileHeader.Open()
		if err != nil {
			c.JSON(http.StatusOK, HTTPGenericResponse{
				Code:    http.StatusInternalServerError,
				Message: "文件讀取失敗:" + err.Error(),
			})
			return
		}
		defer file.Close()

		fileSuffix = path.Ext(fileHeader.Filename)
		//文件全名
		fileName =  fileSuffix

		if _, err = os.Stat(fileDir); os.IsNotExist(err) {
			err = os.MkdirAll(fileDir, FileMode)
			if err != nil {
				c.JSON(http.StatusOK, HTTPGenericResponse{
					Code:    http.StatusInternalServerError,
					Message: "文件創建失敗:" + err.Error(),
				})
				return
			}
		}

		fW, err := os.Create(filepath.Join(fileDir, fileName))
		if err != nil {
			c.JSON(http.StatusOK, HTTPGenericResponse{
				Code:    http.StatusInternalServerError,
				Message: "文件創建失敗:" + err.Error(),
			})
			return
		}
		defer fW.Close()

		_, err = io.Copy(fW, file)
		if err != nil {
			c.JSON(http.StatusOK, HTTPGenericResponse{
				Code:    http.StatusInternalServerError,
				Message: "文件保存失敗:" + err.Error(),
			})
			return
		}
		
	}
	c.JSON(http.StatusOK, HTTPGenericResponse{
				Code:    http.StatusOk,
				Message: "文件保存失敗:" + err.Error(),
			})
	return
}

// DownloadAttachmentHandler ...
func DownloadAttachmentHandler(c *gin.Context) {
	var request api.DownloadAttachmentRequest
	filePath = c.Param("file")
	file, err := os.Open(filePath) //Create a file
	if err != nil {
	   c.JSON(http.StatusNotFound, HTTPGenericResponse{
		Code:    http.StatusInternalServerError,
		Message: "文件加載失敗:" + err.Error(),
	   })
	return
	}
	defer file.Close()
	c.Writer.Header().Add("Content-type", "application/octet-stream")
	_, err = io.Copy(c.Writer, file)
	if err != nil {
		c.JSON(http.StatusNotFound, HTTPGenericResponse{
			Code:    http.StatusInternalServerError,
			Message: "文件加載失敗:" + err.Error(),
		})
	return
	}
}

這兩個方法是我的項目中摳出來的,可能會存在編譯不通過的情況,稍加改動應該就會沒有問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章