go-microservices-tuto/images/handlers/files.go

52 lines
1.4 KiB
Go

package handlers
import (
"net/http"
"path/filepath"
"github.com/gorilla/mux"
hclog "github.com/hashicorp/go-hclog"
"github.com/rjNemo/go-micro/images/files"
)
// Files is a handler for reading and writing files
type Files struct {
log hclog.Logger
store files.Storage
}
// NewFiles creates a new File handler
func NewFiles(s files.Storage, l hclog.Logger) *Files {
return &Files{store: s, log: l}
}
// ServeHTTP implements the http.Handler interface
func (f *Files) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
fn := vars["filename"]
f.log.Info("Handle POST", "id", id, "filename", fn)
// no need to check for invalid id or filename as the mux router will not send requests
// here unless they have the correct parameters
f.saveFile(id, fn, rw, r)
}
func (f *Files) invalidURI(uri string, rw http.ResponseWriter) {
f.log.Error("Invalid path", "path", uri)
http.Error(rw, "Invalid file path should be in the format: /[id]/[filepath]", http.StatusBadRequest)
}
// saveFile saves the contents of the request to a file
func (f *Files) saveFile(id, path string, rw http.ResponseWriter, r *http.Request) {
f.log.Info("Save file for product", "id", id, "path", path)
fp := filepath.Join(id, path)
err := f.store.Save(fp, r.Body)
if err != nil {
f.log.Error("Unable to save file", "error", err)
http.Error(rw, "Unable to save file", http.StatusInternalServerError)
}
}