Skip to content

Commit 11918ee

Browse files
authored
Skip uploading files that exceed the max retries (#83)
* Skip uploading files that exceed the max retries * Wait a bit before uploading next file
1 parent bcb6b5f commit 11918ee

File tree

3 files changed

+62
-51
lines changed

3 files changed

+62
-51
lines changed

packages/dashboard/src/appUtils.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ function mapFile(obj, prefix) {
2121
};
2222
}
2323

24+
export function sleep(ms) {
25+
return new Promise((resolve) => setTimeout(resolve, ms));
26+
}
27+
2428
export async function retryWithBackoff(
2529
operation,
2630
maxAttempts = 3,

packages/dashboard/src/components/utils/DragAndDrop.vue

Lines changed: 57 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
<script>
2626
import { useQuasar } from "quasar";
27-
import { ROOT_FOLDER, apiHandler, decode } from "src/appUtils";
27+
import { ROOT_FOLDER, apiHandler, decode, sleep } from "src/appUtils";
2828
import { useMainStore } from "stores/main-store";
2929
3030
export default {
@@ -168,69 +168,76 @@ export default {
168168
169169
const chunkSize = 95 * 1024 * 1024;
170170
// Files bigger than 100MB require multipart upload
171-
if (file.size > chunkSize) {
172-
const { uploadId } = (
173-
await apiHandler.multipartCreate(file, key, this.selectedBucket)
174-
).data;
175-
176-
let partNumber = 1;
177-
const parts = [];
178-
// console.log('total: ', file.size)
179-
// console.log('chunk: ', chunkSize)
180-
181-
for (let start = 0; start < file.size; start += chunkSize) {
182-
const end = Math.min(start + chunkSize, file.size);
183-
const chunk = file.slice(start, end);
184-
// console.log(`${start} -> ${end}`)
185-
186-
const { data } = await apiHandler.multipartUpload(
187-
uploadId,
188-
partNumber,
171+
172+
try {
173+
if (file.size > chunkSize) {
174+
const { uploadId } = (
175+
await apiHandler.multipartCreate(file, key, this.selectedBucket)
176+
).data;
177+
178+
let partNumber = 1;
179+
const parts = [];
180+
// console.log('total: ', file.size)
181+
// console.log('chunk: ', chunkSize)
182+
183+
for (let start = 0; start < file.size; start += chunkSize) {
184+
const end = Math.min(start + chunkSize, file.size);
185+
const chunk = file.slice(start, end);
186+
// console.log(`${start} -> ${end}`)
187+
188+
const { data } = await apiHandler.multipartUpload(
189+
uploadId,
190+
partNumber,
191+
this.selectedBucket,
192+
key,
193+
chunk,
194+
(progressEvent) => {
195+
//console.log((start + progressEvent.loaded) * 100 / file.size)
196+
notif({
197+
caption: `${Number.parseInt(((uploadSize + start + progressEvent.loaded) * 100) / totalSize)}%`,
198+
});
199+
// self.$store.dispatch('setUploadProgress', {
200+
// filename: file.name,
201+
// progress: (start + progressEvent.loaded) * 100 / file.size
202+
// }) // TODO
203+
},
204+
);
205+
206+
parts.push(data);
207+
partNumber += 1;
208+
}
209+
210+
await apiHandler.multipartComplete(
211+
file,
212+
key,
189213
this.selectedBucket,
214+
parts,
215+
uploadId,
216+
);
217+
} else {
218+
await apiHandler.uploadObjects(
219+
file,
190220
key,
191-
chunk,
221+
this.selectedBucket,
192222
(progressEvent) => {
193-
//console.log((start + progressEvent.loaded) * 100 / file.size)
223+
//console.log(progressEvent.loaded * 100 / file.size)
194224
notif({
195-
caption: `${Number.parseInt(((uploadSize + start + progressEvent.loaded) * 100) / totalSize)}%`,
225+
caption: `${Number.parseInt(((uploadSize + progressEvent.loaded) * 100) / totalSize)}%`,
196226
});
197227
// self.$store.dispatch('setUploadProgress', {
198228
// filename: file.name,
199-
// progress: (start + progressEvent.loaded) * 100 / file.size
229+
// progress: progressEvent.loaded * 100 / file.size
200230
// }) // TODO
201231
},
202232
);
203-
204-
parts.push(data);
205-
partNumber += 1;
206233
}
207-
208-
await apiHandler.multipartComplete(
209-
file,
210-
key,
211-
this.selectedBucket,
212-
parts,
213-
uploadId,
214-
);
215-
} else {
216-
await apiHandler.uploadObjects(
217-
file,
218-
key,
219-
this.selectedBucket,
220-
(progressEvent) => {
221-
//console.log(progressEvent.loaded * 100 / file.size)
222-
notif({
223-
caption: `${Number.parseInt(((uploadSize + progressEvent.loaded) * 100) / totalSize)}%`,
224-
});
225-
// self.$store.dispatch('setUploadProgress', {
226-
// filename: file.name,
227-
// progress: progressEvent.loaded * 100 / file.size
228-
// }) // TODO
229-
},
230-
);
234+
} catch (e) {
235+
console.error(`Unable to upload file ${file.name}: ${e.message}`);
231236
}
232237
233238
uploadSize += file.size;
239+
240+
await sleep(200);
234241
}
235242
}
236243

packages/worker/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "r2-explorer",
3-
"version": "1.1.6",
3+
"version": "1.1.7",
44
"description": "A Google Drive Interface for your Cloudflare R2 Buckets",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",

0 commit comments

Comments
 (0)