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