Skip to content

Instantly share code, notes, and snippets.

@eoinahern
Created April 17, 2022 19:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eoinahern/2efe8245188f09884b52659d8e4ac36f to your computer and use it in GitHub Desktop.
Save eoinahern/2efe8245188f09884b52659d8e4ac36f to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"encoding/json"
"errors"
"fmt"
"mime/multipart"
"net/http"
"os"
"path"
"github.com/gorilla/mux"
)
type FileInfo struct {
Name string `json:"name"`
Extension string `json:"extension"`
}
type FileUploadRoute struct {
}
var scanner bufio.Scanner
func (t *FileUploadRoute) ServeHTTP(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(r.ContentLength)
if err != nil {
w.WriteHeader(http.StatusBadGateway)
w.Write([]byte("error pasing form"))
return
}
var fileInfo FileInfo
strJson := r.PostFormValue("fileinfo")
file, header, filerr := r.FormFile("file")
err = json.Unmarshal([]byte(strJson), &fileInfo)
defer file.Close()
if err != nil || filerr != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
err = saveFile(file, header)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
func saveFile(file multipart.File, fileHeader *multipart.FileHeader) error {
var saveFile *os.File
reader := bufio.NewReader(file)
scanner = *bufio.NewScanner(reader)
scanner.Split(bufio.ScanBytes)
fileNameStr := path.Join(".", "files", fileHeader.Filename)
os.MkdirAll("./files", os.ModeDir)
if _, fileError := os.Stat(fileNameStr); errors.Is(fileError, os.ErrNotExist) {
saveFile, createError := os.Create(fileNameStr)
if createError != nil {
return createError
}
for scanner.Scan() {
bytes := scanner.Bytes()
saveFile.Write(bytes)
}
} else {
//recreate or replace file? option
}
saveFile.Close()
if scanErr := scanner.Err(); scanErr != nil {
return scanErr
} else {
return nil
}
}
func main() {
router := mux.NewRouter()
router.Handle("/uploadFile", &FileUploadRoute{}).Methods(http.MethodPost)
http.ListenAndServe(":8000", router)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment