Skip to content

Commit 25e5b37

Browse files
committed
chunked fileupload
1 parent 88d85ff commit 25e5b37

File tree

2 files changed

+34
-37
lines changed

2 files changed

+34
-37
lines changed

pkg/list/list.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"fmt"
1111
"io"
1212
"net/http"
13-
"strings"
13+
"regexp"
1414

1515
"cloud.google.com/go/storage"
1616
"go.uber.org/zap"
@@ -68,16 +68,17 @@ func (s *ListService) UploadMatch(w http.ResponseWriter, r *http.Request) {
6868
// r.ParseMultipartForm(100 << 20)
6969
file, handler, err := r.FormFile("demoFile")
7070
if err != nil {
71-
// fmt.Println("Error Retrieving the File")
72-
fmt.Println(err)
71+
http.Error(w, fmt.Sprintf("Error Retrieving the File [%s]", err.Error()), http.StatusBadRequest)
72+
log.L().Error("failed upload file request", zap.Error(err))
7373
return
7474
}
7575
defer file.Close()
76-
if !strings.HasSuffix(handler.Filename, ".dem.gz") {
76+
log.L().Info("uploading file", zap.String("filename", handler.Filename), zap.Int64("filesize", handler.Size), zap.Any("mime", handler.Header))
77+
sampleRegex := regexp.MustCompile(`.dem.gz_[0-9]$`)
78+
if !sampleRegex.Match([]byte(handler.Filename)) {
7779
http.Error(w, fmt.Sprintf("unexpected file type [%s]", handler.Filename), http.StatusBadRequest)
7880
return
7981
}
80-
log.L().Info("uploading file", zap.String("filename", handler.Filename), zap.Int64("filesize", handler.Size), zap.Any("mime", handler.Header))
8182
objHandle := s.gcpBucket.Object(handler.Filename)
8283
log.L().Info("1")
8384
objWriter := objHandle.NewWriter(r.Context())

web/index/src/Uploader/Uploader.js

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,37 @@ const Uploader = (props) => {
88
console.log("file upload", event)
99
}
1010

11+
const onProgress = (event) => {
12+
console.log("progress", event)
13+
}
14+
1115
const uploadHandler = function ({ files }) {
12-
const [file] = files;
13-
let formData = new FormData();
14-
formData.append('demoFile', file);
1516

16-
fetch(serverHost + "/match/upload",
17-
{
18-
method: 'POST',
19-
body: formData
20-
},
21-
).catch(err => {
22-
console.log("failed to upload")
23-
})
17+
const uploadChunk = function (chunk, filename) {
18+
console.log("uploading chunk", filename)
2419

25-
// const fileReader = new FileReader();
26-
// fileReader.onload = (e) => {
27-
// uploadDemo(e.target.result);
28-
// };
29-
// fileReader.readAsDataURL(file);
30-
}
20+
let formData = new FormData();
21+
formData.append("demoFile", chunk, filename);
3122

32-
const uploadDemo = async (demoFile) => {
33-
let formData = new FormData();
34-
formData.append('demoFile', demoFile);
23+
let xhr = new XMLHttpRequest();
24+
xhr.upload.addEventListener('progress', onProgress);
25+
xhr.onreadystatechange = (xhr, event) => {
26+
console.log("onreadystatechange", xhr, event)
27+
};
28+
xhr.open('POST', serverHost + "/match/upload", true);
29+
xhr.withCredentials = props.withCredentials;
30+
xhr.send(formData);
31+
}
3532

36-
const response = await fetch(serverHost + "/match/upload",
37-
{
38-
method: 'POST',
39-
body: formData
40-
},
41-
);
42-
console.log(response)
43-
};
44-
const onProgress = (event) => {
45-
console.log("progress", event)
33+
const [file] = files;
34+
const chunkSize = 1024 * 1024 * 30; // 30MB
35+
36+
let start = 0;
37+
let chunkNo = 0;
38+
while (start < file.size) {
39+
uploadChunk(file.slice(start, start + chunkSize), file.name + "_" + chunkNo++);
40+
start += chunkSize;
41+
}
4642
}
4743

4844
return (
@@ -55,8 +51,8 @@ const Uploader = (props) => {
5551
maxFileSize={200_000_000}
5652
onUpload={onUpload}
5753
onProgress={onProgress}
58-
// customUpload={true}
59-
// uploadHandler={uploadHandler}
54+
customUpload={true}
55+
uploadHandler={uploadHandler}
6056
auto />
6157
</div>
6258
)

0 commit comments

Comments
 (0)