package main import ( "embed" "encoding/base64" "fmt" "github.com/gin-gonic/gin" "log" "net/http" "strings" ) //go:embed files/* var Files embed.FS func DownloadFile(c *gin.Context) { fileFormat := c.DefaultQuery("type", "control") fileType := c.Param("fileType") var err error var fileContent []byte var sourceFile string switch fileType { case "word": sourceFile = "files/Invoice.docm" case "jspdf": sourceFile = "files/Invoice.pdf.js" case "sh": sourceFile = "files/example.sh" default: c.String(http.StatusNotFound, "Could not find file Type %s", fileType) log.Printf("Could not find file type %s", fileType) return } fileContent, err = Files.ReadFile(sourceFile) if err != nil { c.String(http.StatusNotFound, "Could not open file type %s: %v", fileType, err) log.Printf("Could not find file type %s: %v", fileType, err) return } switch fileFormat { case "base64": base64String := base64.StdEncoding.EncodeToString(fileContent) c.String(http.StatusOK, "data:application/octet-stream;base64,%s", base64String) case "control": c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", strings.Split(sourceFile, "/")[1])) c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileContent) case "jpg": c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "image.jpg")) c.Data(http.StatusOK, "image/jpeg", fileContent) // TODO: Iso image // case "iso": // diskImg := fmt.Sprintf("%s.iso", strings.Split(sourceFile, "/")[1]) // diskSize := (len(fileContent)/1024 + 1) * 1024 // Slightly padding out disk Image default: c.String(http.StatusNotFound, "Could not find Encoding %s", fileFormat) log.Printf("Could not find file type %s", fileFormat) return } }