Separate handlers for create object
This commit is contained in:
parent
abcdae86a9
commit
6778d23090
4 changed files with 64 additions and 52 deletions
|
@ -4,7 +4,6 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
minio "github.com/minio/minio-go"
|
||||
|
@ -18,57 +17,60 @@ type CopyObjectInfo struct {
|
|||
SourceObjectName string `json:"sourceObjectName"`
|
||||
}
|
||||
|
||||
// CreateObjectHandler allows to upload a new object
|
||||
func CreateObjectHandler(s3 S3Client) http.Handler {
|
||||
// CreateObjectFromJSONHandler allows to copy an existing object
|
||||
func CreateObjectFromJSONHandler(s3 S3Client) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
var copy CopyObjectInfo
|
||||
|
||||
if strings.Contains(r.Header.Get(headerContentType), contentTypeJSON) {
|
||||
var copy CopyObjectInfo
|
||||
err := json.NewDecoder(r.Body).Decode(©)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
err := json.NewDecoder(r.Body).Decode(©)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
copyConds := minio.NewCopyConditions()
|
||||
objectSource := fmt.Sprintf("/%s/%s", copy.SourceBucketName, copy.SourceObjectName)
|
||||
err = s3.CopyObject(copy.BucketName, copy.ObjectName, objectSource, copyConds)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
copyConds := minio.NewCopyConditions()
|
||||
objectSource := fmt.Sprintf("/%s/%s", copy.SourceBucketName, copy.SourceObjectName)
|
||||
err = s3.CopyObject(copy.BucketName, copy.ObjectName, objectSource, copyConds)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
w.Header().Set(headerContentType, contentTypeJSON)
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
|
||||
w.Header().Set(headerContentType, contentTypeJSON)
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
|
||||
err = json.NewEncoder(w).Encode(copy)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
err := r.ParseMultipartForm(32 << 20)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusUnprocessableEntity, err)
|
||||
return
|
||||
}
|
||||
|
||||
file, handler, err := r.FormFile("file")
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
_, err = s3.PutObject(vars["bucketName"], handler.Filename, file, contentTypeOctetStream)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
err = json.NewEncoder(w).Encode(copy)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// CreateObjectFromFormHandler allows to upload a new object
|
||||
func CreateObjectFromFormHandler(s3 S3Client) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
|
||||
err := r.ParseMultipartForm(32 << 20)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusUnprocessableEntity, err)
|
||||
return
|
||||
}
|
||||
|
||||
file, handler, err := r.FormFile("file")
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
_, err = s3.PutObject(vars["bucketName"], handler.Filename, file, contentTypeOctetStream)
|
||||
if err != nil {
|
||||
handleHTTPError(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
})
|
||||
}
|
||||
|
|
4
glide.lock
generated
4
glide.lock
generated
|
@ -1,8 +1,8 @@
|
|||
hash: 9b88c8ce183463a407bdb87f79b6b857d8343a7bb5ce4723223c539c654d6d6d
|
||||
updated: 2017-04-11T20:07:50.857342641+02:00
|
||||
updated: 2017-04-14T19:23:49.562207386+02:00
|
||||
imports:
|
||||
- name: github.com/gorilla/context
|
||||
version: 08b5f424b9271eedf6f9f0ce86cb9396ed337a42
|
||||
version: 1ea25387ff6f684839d82767c1733ff4d4d15d0a
|
||||
- name: github.com/gorilla/mux
|
||||
version: 392c28fe23e1c45ddba891b0320b3b5df220beea
|
||||
- name: github.com/mastertinner/adapters
|
||||
|
|
12
main.go
12
main.go
|
@ -15,6 +15,7 @@ const (
|
|||
headerContentType = "Content-Type"
|
||||
headerContentDisposition = "Content-Disposition"
|
||||
contentTypeJSON = "application/json"
|
||||
contentTypeMultipartForm = "multipart/form-data"
|
||||
contentTypeOctetStream = "application/octet-stream"
|
||||
)
|
||||
|
||||
|
@ -68,9 +69,18 @@ func main() {
|
|||
))
|
||||
br.
|
||||
Methods(http.MethodPost).
|
||||
Headers(headerContentType, contentTypeJSON).
|
||||
Path("/{bucketName}/objects").
|
||||
Handler(adapters.Adapt(
|
||||
CreateObjectHandler(s3),
|
||||
CreateObjectFromJSONHandler(s3),
|
||||
logging.Handler(logger),
|
||||
))
|
||||
br.
|
||||
Methods(http.MethodPost).
|
||||
HeadersRegexp(headerContentType, contentTypeMultipartForm).
|
||||
Path("/{bucketName}/objects").
|
||||
Handler(adapters.Adapt(
|
||||
CreateObjectFromFormHandler(s3),
|
||||
logging.Handler(logger),
|
||||
))
|
||||
br.
|
||||
|
|
4
minio.go
4
minio.go
|
@ -19,12 +19,12 @@ func newMinioClient() (*minio.Client, error) {
|
|||
|
||||
s3AccessKeyID := os.Getenv("S3_ACCESS_KEY_ID")
|
||||
if s3AccessKeyID == "" {
|
||||
return c, errors.New("no S3_ACCESS_KEY_ID found")
|
||||
return nil, errors.New("no S3_ACCESS_KEY_ID found")
|
||||
}
|
||||
|
||||
s3SecretAccessKey := os.Getenv("S3_SECRET_ACCESS_KEY")
|
||||
if s3SecretAccessKey == "" {
|
||||
return c, errors.New("no S3_SECRET_ACCESS_KEY found")
|
||||
return nil, errors.New("no S3_SECRET_ACCESS_KEY found")
|
||||
}
|
||||
|
||||
if os.Getenv("V2_SIGNING") == "true" {
|
||||
|
|
Loading…
Reference in a new issue