c5_labsci/web/admin/upload.go
2026-01-27 00:52:00 +08:00

113 lines
3.9 KiB
Go

package admin
import (
c "ciyon/zciyon"
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"net/http"
"time"
)
func Upload_upload(w http.ResponseWriter, r *http.Request) bool {
uploadcfg := map[string][]string{
"exts": {"jpe", "jpg", "jpeg", "gif", "png", "ai", "bmp", "psb", "psd", "tif", "svg", "webp", "zip", "7z", "rar", "tar", "arj", "iso", "cab", "gz", "txt", "csv", "doc", "docx", "pps", "ppt", "pptx", "pdf", "wps", "wpt", "xls", "xlsx", "xml", "et", "ett", "avi", "mp4", "mp3", "swf", "flv", "f4v", "m4v", "wma", "rm", "rmvb", "3gp", "ts", "mts", "vob", "mpg", "mpeg", "mov", "wmv", "wav", "bak", "cad", "chm", "log", "ai", "ico"},
"noexts": {"goc", "php", "php3", "php4", "phtm", "phtml", "php5", "js", "html", "htm", "sh", "so"},
}
extselect := "exts"
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
path := post.Get("pathfile")
file := post.Getfile()
// if file.content == nil {
// return c.ErrJSON(w, fmt.Sprintf("文件上传错误"))
// }
// if file.Size != len(file.content) {
// return c.ErrJSON(w, fmt.Sprintf("文件大小不匹配:%d!=%d", file.Size, len(file.content)))
// }
_, extfile := c.Fileext(file.Filename)
if extselect == "exts" {
if c.In_array(uploadcfg[extselect], extfile) == -1 {
return c.ErrJSON(w, "不允许上传"+extfile+"类型文件")
}
} else {
if c.In_array(uploadcfg[extselect], extfile) > -1 {
return c.ErrJSON(w, "禁止上传"+extfile+"类型文件")
}
}
json, err := c.SaveUploadFile(path, file)
if err != nil {
return c.ErrJSON(w, err.Error())
}
return c.SuccJSON(w, r, json)
}
func Upload_s3(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
path := post.Get("pathfile")
storselect := post.Get("storselect")
accessKey := c.CiyVars.Ini.GetKey("s3"+storselect, "access", "")
secretKey := c.CiyVars.Ini.GetKey("s3"+storselect, "secret", "")
endpoint := c.CiyVars.Ini.GetKey("s3"+storselect, "endpoint", "")
region := c.CiyVars.Ini.GetKey("s3"+storselect, "region", "")
bucket := c.CiyVars.Ini.GetKey("s3"+storselect, "bucket", "")
acl := c.CiyVars.Ini.GetKey("s3"+storselect, "acl", "")
objectKey := "ud/" + path
vsha256 := "UNSIGNED-PAYLOAD"
zdate := time.Now().UTC().Format("20060102T150405Z")
shortDate := zdate[0:8]
dateKey := sign([]byte("AWS4"+secretKey), shortDate)
regionKey := sign(dateKey, region)
serviceKey := sign(regionKey, "s3")
signingKey := sign(serviceKey, "aws4_request")
canonicalUri := "/" + bucket + "/" + objectKey
canonicalQueryString := ""
canonicalHeaders := "host:" + endpoint + "\n" +
"x-amz-acl:" + acl + "\n" +
"x-amz-content-sha256:" + vsha256 + "\n" +
"x-amz-date:" + zdate + "\n"
signedHeaders := "host;x-amz-acl;x-amz-content-sha256;x-amz-date"
canonicalRequest := "PUT\n" +
canonicalUri + "\n" +
canonicalQueryString + "\n" +
canonicalHeaders + "\n" +
signedHeaders + "\n" +
vsha256
stringToSign := "AWS4-HMAC-SHA256\n" +
zdate + "\n" +
shortDate + "/" + region + "/s3/aws4_request\n" +
sha256Hex(canonicalRequest)
signature := sign([]byte(signingKey), stringToSign)
authorizationHeader := "AWS4-HMAC-SHA256 Credential=" + accessKey + "/" + shortDate + "/" + region + "/s3/aws4_request, SignedHeaders=" + signedHeaders + ", Signature=" + hex.EncodeToString(signature)
ret := make(map[string]interface{})
ret["method"] = "PUT"
ret["url"] = "https://" + endpoint + "/" + bucket + "/" + objectKey
headers := make(map[string]string)
headers["Authorization"] = authorizationHeader
headers["x-amz-acl"] = acl
headers["x-amz-content-sha256"] = vsha256
headers["x-amz-date"] = zdate
ret["headers"] = headers
return c.SuccJSON(w, r, ret)
}
func sign(key []byte, msg string) []byte {
h := hmac.New(sha256.New, key)
h.Write([]byte(msg))
return h.Sum(nil)
}
func sha256Hex(data string) string {
hash := sha256.New()
hash.Write([]byte(data))
return hex.EncodeToString(hash.Sum(nil))
}