mirror of
https://github.com/khairul169/garage-webui.git
synced 2026-09-15 00:43:21 +07:00
feat: add bucket browser
This commit is contained in:
@@ -72,6 +72,8 @@ func (b *Browse) GetObjects(w http.ResponseWriter, r *http.Request) {
|
||||
ObjectKey: &key,
|
||||
LastModified: object.LastModified,
|
||||
Size: object.Size,
|
||||
ViewUrl: fmt.Sprintf("/browse/%s/%s?view=1", bucket, *object.Key),
|
||||
DownloadUrl: fmt.Sprintf("/browse/%s/%s?dl=1", bucket, *object.Key),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -111,6 +113,11 @@ func (b *Browse) GetOneObject(w http.ResponseWriter, r *http.Request) {
|
||||
keys := strings.Split(key, "/")
|
||||
|
||||
w.Header().Set("Content-Type", *object.ContentType)
|
||||
w.Header().Set("Content-Length", strconv.FormatInt(*object.ContentLength, 10))
|
||||
w.Header().Set("Cache-Control", "max-age=86400")
|
||||
w.Header().Set("Last-Modified", object.LastModified.Format(time.RFC1123))
|
||||
w.Header().Set("Etag", *object.ETag)
|
||||
|
||||
if download {
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", keys[len(keys)-1]))
|
||||
}
|
||||
@@ -128,6 +135,74 @@ func (b *Browse) GetOneObject(w http.ResponseWriter, r *http.Request) {
|
||||
utils.ResponseSuccess(w, object)
|
||||
}
|
||||
|
||||
func (b *Browse) PutObject(w http.ResponseWriter, r *http.Request) {
|
||||
bucket := r.PathValue("bucket")
|
||||
key := r.PathValue("key")
|
||||
isDirectory := strings.HasSuffix(key, "/")
|
||||
|
||||
file, headers, err := r.FormFile("file")
|
||||
if err != nil && !isDirectory {
|
||||
utils.ResponseError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
if file != nil {
|
||||
defer file.Close()
|
||||
}
|
||||
|
||||
client, err := getS3Client(bucket)
|
||||
if err != nil {
|
||||
utils.ResponseError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
var contentType string = ""
|
||||
var size int64 = 0
|
||||
|
||||
if file != nil {
|
||||
contentType = headers.Header.Get("Content-Type")
|
||||
size = headers.Size
|
||||
}
|
||||
|
||||
result, err := client.PutObject(context.Background(), &s3.PutObjectInput{
|
||||
Bucket: aws.String(bucket),
|
||||
Key: aws.String(key),
|
||||
Body: file,
|
||||
ContentLength: aws.Int64(size),
|
||||
ContentType: aws.String(contentType),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
utils.ResponseError(w, fmt.Errorf("cannot put object: %w", err))
|
||||
return
|
||||
}
|
||||
|
||||
utils.ResponseSuccess(w, result)
|
||||
}
|
||||
|
||||
func (b *Browse) DeleteObject(w http.ResponseWriter, r *http.Request) {
|
||||
bucket := r.PathValue("bucket")
|
||||
key := r.PathValue("key")
|
||||
|
||||
client, err := getS3Client(bucket)
|
||||
if err != nil {
|
||||
utils.ResponseError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
_, err = client.DeleteObject(context.Background(), &s3.DeleteObjectInput{
|
||||
Bucket: aws.String(bucket),
|
||||
Key: aws.String(key),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
utils.ResponseError(w, fmt.Errorf("cannot delete object: %w", err))
|
||||
return
|
||||
}
|
||||
|
||||
utils.ResponseSuccess(w, nil)
|
||||
}
|
||||
|
||||
func getBucketCredentials(bucket string) (aws.CredentialsProvider, error) {
|
||||
cacheKey := fmt.Sprintf("key:%s", bucket)
|
||||
cacheData := utils.Cache.Get(cacheKey)
|
||||
|
||||
@@ -14,6 +14,8 @@ func HandleApiRouter() *http.ServeMux {
|
||||
browse := &Browse{}
|
||||
router.HandleFunc("GET /browse/{bucket}", browse.GetObjects)
|
||||
router.HandleFunc("GET /browse/{bucket}/{key...}", browse.GetOneObject)
|
||||
router.HandleFunc("PUT /browse/{bucket}/{key...}", browse.PutObject)
|
||||
router.HandleFunc("DELETE /browse/{bucket}/{key...}", browse.DeleteObject)
|
||||
|
||||
router.HandleFunc("/", ProxyHandler)
|
||||
|
||||
|
||||
@@ -13,4 +13,6 @@ type BrowserObject struct {
|
||||
ObjectKey *string `json:"objectKey"`
|
||||
LastModified *time.Time `json:"lastModified"`
|
||||
Size *int64 `json:"size"`
|
||||
ViewUrl string `json:"viewUrl"`
|
||||
DownloadUrl string `json:"downloadUrl"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user