parent
b5dacbc9bf
commit
0d78f1dc33
|
@ -131,6 +131,61 @@ func handleGetUploadedParts(w http.ResponseWriter, req *http.Request) {
|
|||
encoder.Encode(getUploadedPartsRes(parts))
|
||||
}
|
||||
|
||||
/* batchSignPartsUpload */
|
||||
|
||||
type batchSignPartsUploadRes struct {
|
||||
PresignedURLs map[string]string `json:"presignedUrls"`
|
||||
}
|
||||
|
||||
func handleBatchSignPartsUpload(w http.ResponseWriter, req *http.Request) {
|
||||
vars := mux.Vars(req)
|
||||
cred, err := getCredential(vars["id"])
|
||||
if err != nil {
|
||||
errorResponse(w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
uploadID := vars["uploadID"]
|
||||
key := req.URL.Query().Get("key")
|
||||
partNumbers := req.URL.Query().Get("partNumbers")
|
||||
|
||||
if uploadID == "" || key == "" || partNumbers == "" {
|
||||
errorResponse(w, req, fmt.Errorf("%w", errBadRequest))
|
||||
return
|
||||
}
|
||||
|
||||
partNumbersArray := strings.Split(partNumbers, ",")
|
||||
partNumbersParsed := make([]uint16, 0, len(partNumbersArray))
|
||||
for _, partNumber := range partNumbersArray {
|
||||
n, err := strconv.ParseUint(partNumber, 10, 16)
|
||||
if n < 1 || n > 10000 || err != nil {
|
||||
errorResponse(w, req, fmt.Errorf("%w: invalid part number", errBadRequest))
|
||||
return
|
||||
}
|
||||
partNumbersParsed = append(partNumbersParsed, uint16(n))
|
||||
}
|
||||
|
||||
presignedURLs := make(map[string]string, len(partNumbersParsed))
|
||||
for _, partNumber := range partNumbersParsed {
|
||||
params := make(url.Values)
|
||||
params.Add("partNumber", strconv.FormatUint(uint64(partNumber), 10))
|
||||
params.Add("uploadId", uploadID)
|
||||
unsignedReq, err := http.NewRequest(http.MethodPut, cred.Endpoint+"/"+key+"?"+params.Encode(), nil)
|
||||
if err != nil {
|
||||
errorResponse(w, req, fmt.Errorf("%w: %s", errInternalServerError, err))
|
||||
return
|
||||
}
|
||||
|
||||
signedReq := preSign(unsignedReq, cred)
|
||||
presignedURLs[strconv.FormatUint(uint64(partNumber), 10)] = signedReq.URL.String()
|
||||
}
|
||||
|
||||
encoder := json.NewEncoder(w)
|
||||
encoder.Encode(batchSignPartsUploadRes{
|
||||
PresignedURLs: presignedURLs,
|
||||
})
|
||||
}
|
||||
|
||||
/* signPartUpload */
|
||||
|
||||
type signPartUploadRes struct {
|
||||
|
|
1
main.go
1
main.go
|
@ -38,6 +38,7 @@ func main() {
|
|||
|
||||
s3Router.Methods(http.MethodPost).Path("").HandlerFunc(handleCreateMultipartUpload)
|
||||
s3Router.Methods(http.MethodGet).Path("/{uploadID}").HandlerFunc(handleGetUploadedParts)
|
||||
s3Router.Methods(http.MethodGet).Path("/{uploadID}/batch").HandlerFunc(handleBatchSignPartsUpload)
|
||||
s3Router.Methods(http.MethodGet).Path("/{uploadID}/{uploadPart}").HandlerFunc(handleSignPartUpload)
|
||||
s3Router.Methods(http.MethodPost).Path("/{uploadID}/complete").HandlerFunc(handleCompleteMultipartUpload)
|
||||
s3Router.Methods(http.MethodDelete).Path("/{uploadID}").HandlerFunc(handleAbortMultipartUpload)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -8,18 +8,18 @@
|
|||
"watch": "rollup --config --watch"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-commonjs": "^19.0.0",
|
||||
"@rollup/plugin-node-resolve": "^13.0.0",
|
||||
"@tailwindcss/forms": "^0.3.2",
|
||||
"@uppy/aws-s3-multipart": "^1.8.15",
|
||||
"@uppy/core": "^1.18.1",
|
||||
"@uppy/drag-drop": "^1.4.27",
|
||||
"@uppy/status-bar": "^1.9.3",
|
||||
"filesize": "^6.3.0",
|
||||
"rollup": "^2.48.0",
|
||||
"@rollup/plugin-commonjs": "^21.0.1",
|
||||
"@rollup/plugin-node-resolve": "^13.1.3",
|
||||
"@tailwindcss/forms": "^0.4.0",
|
||||
"@uppy/aws-s3-multipart": "^2.2.0",
|
||||
"@uppy/core": "^2.1.5",
|
||||
"@uppy/drag-drop": "^2.0.6",
|
||||
"@uppy/status-bar": "^2.1.2",
|
||||
"filesize": "^8.0.7",
|
||||
"rollup": "^2.67.2",
|
||||
"rollup-plugin-copy": "^3.4.0",
|
||||
"rollup-plugin-postcss": "^4.0.0",
|
||||
"rollup-plugin-postcss": "^4.0.2",
|
||||
"rollup-plugin-terser": "^7.0.2",
|
||||
"tailwindcss": "^2.1.2"
|
||||
"tailwindcss": "^3.0.22"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,12 @@ uploadAreas.forEach(uploadArea => {
|
|||
|
||||
/* Uppy */
|
||||
|
||||
let limit = window.localStorage.getItem('parallel');
|
||||
if (!limit) {
|
||||
limit = 3;
|
||||
}
|
||||
window.localStorage.setItem('parallel', 3);
|
||||
|
||||
const uppy = new Uppy({
|
||||
autoProceed: true,
|
||||
});
|
||||
|
@ -54,7 +60,7 @@ uploadAreas.forEach(uploadArea => {
|
|||
showProgressDetails: true,
|
||||
});
|
||||
uppy.use(AwsS3Multipart, {
|
||||
limit: 3,
|
||||
limit,
|
||||
companionUrl: window.location.pathname,
|
||||
});
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
module.exports = {
|
||||
purge: [
|
||||
content: [
|
||||
'./*.tmpl',
|
||||
'./src/*.js',
|
||||
],
|
||||
|
|
Loading…
Reference in New Issue