Process files sequentially to avoid too many simultaneous requests
This commit is contained in:
parent
d775b8be72
commit
e472850f83
|
@ -338,92 +338,90 @@ Oqtane.Interop = {
|
|||
progressbar.value = 0;
|
||||
}
|
||||
|
||||
const uploadFiles = Array.from(fileinput.files).map(file => {
|
||||
const uploadFile = () => {
|
||||
const chunkSize = chunksize * (1024 * 1024);
|
||||
const totalParts = Math.ceil(file.size / chunkSize);
|
||||
let partCount = 0;
|
||||
const uploadFile = (file) => {
|
||||
const chunkSize = chunksize * (1024 * 1024);
|
||||
const totalParts = Math.ceil(file.size / chunkSize);
|
||||
let partCount = 0;
|
||||
|
||||
let activeUploads = 0;
|
||||
let activeUploads = 0;
|
||||
|
||||
const uploadPart = (partCount) => {
|
||||
const start = partCount * chunkSize;
|
||||
const end = Math.min(start + chunkSize, file.size);
|
||||
const chunk = file.slice(start, end);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let formdata = new FormData();
|
||||
formdata.append('__RequestVerificationToken', antiforgerytoken);
|
||||
formdata.append('folder', folder);
|
||||
formdata.append('formfile', chunk, file.name);
|
||||
|
||||
var credentials = 'same-origin';
|
||||
var headers = new Headers();
|
||||
headers.append('PartCount', partCount + 1);
|
||||
headers.append('TotalParts', totalParts);
|
||||
if (jwt !== "") {
|
||||
headers.append('Authorization', 'Bearer ' + jwt);
|
||||
credentials = 'include';
|
||||
}
|
||||
|
||||
return fetch(posturl, {
|
||||
method: 'POST',
|
||||
headers: headers,
|
||||
credentials: credentials,
|
||||
body: formdata
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
if (progressinfo !== null) {
|
||||
progressinfo.innerHTML = 'Error: ' + response.statusText;
|
||||
}
|
||||
throw new Error('Failed');
|
||||
}
|
||||
return;
|
||||
})
|
||||
.then(data => {
|
||||
if (progressbar !== null) {
|
||||
uploadSize += chunk.size;
|
||||
var percent = Math.ceil((uploadSize / totalSize) * 100);
|
||||
progressbar.value = (percent / 100);
|
||||
}
|
||||
resolve(data);
|
||||
})
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
};
|
||||
const uploadPart = (partCount) => {
|
||||
const start = partCount * chunkSize;
|
||||
const end = Math.min(start + chunkSize, file.size);
|
||||
const chunk = file.slice(start, end);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
function processNextUpload() {
|
||||
if (partCount >= totalParts) {
|
||||
if (activeUploads === 0) resolve(); // Done uploading all parts
|
||||
return;
|
||||
}
|
||||
let formdata = new FormData();
|
||||
formdata.append('__RequestVerificationToken', antiforgerytoken);
|
||||
formdata.append('folder', folder);
|
||||
formdata.append('formfile', chunk, file.name);
|
||||
|
||||
while (activeUploads < maxConcurrentUploads && partCount < totalParts) {
|
||||
uploadPart(partCount)
|
||||
.then(() => {
|
||||
activeUploads--;
|
||||
processNextUpload();
|
||||
})
|
||||
.catch(reject);
|
||||
|
||||
activeUploads++;
|
||||
partCount++;
|
||||
}
|
||||
var credentials = 'same-origin';
|
||||
var headers = new Headers();
|
||||
headers.append('PartCount', partCount + 1);
|
||||
headers.append('TotalParts', totalParts);
|
||||
if (jwt !== "") {
|
||||
headers.append('Authorization', 'Bearer ' + jwt);
|
||||
credentials = 'include';
|
||||
}
|
||||
|
||||
processNextUpload();
|
||||
return fetch(posturl, {
|
||||
method: 'POST',
|
||||
headers: headers,
|
||||
credentials: credentials,
|
||||
body: formdata
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
if (progressinfo !== null) {
|
||||
progressinfo.innerHTML = 'Error: ' + response.statusText;
|
||||
}
|
||||
throw new Error('Failed');
|
||||
}
|
||||
return;
|
||||
})
|
||||
.then(data => {
|
||||
if (progressbar !== null) {
|
||||
uploadSize += chunk.size;
|
||||
var percent = Math.ceil((uploadSize / totalSize) * 100);
|
||||
progressbar.value = (percent / 100);
|
||||
}
|
||||
resolve(data);
|
||||
})
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
return uploadFile();
|
||||
});
|
||||
return new Promise((resolve, reject) => {
|
||||
function processNextUpload() {
|
||||
if (partCount >= totalParts) {
|
||||
if (activeUploads === 0) resolve(); // Done uploading all parts in the file
|
||||
return;
|
||||
}
|
||||
|
||||
while (activeUploads < maxConcurrentUploads && partCount < totalParts) {
|
||||
uploadPart(partCount)
|
||||
.then(() => {
|
||||
activeUploads--;
|
||||
processNextUpload();
|
||||
})
|
||||
.catch(reject);
|
||||
|
||||
activeUploads++;
|
||||
partCount++;
|
||||
}
|
||||
}
|
||||
|
||||
processNextUpload();
|
||||
});
|
||||
};
|
||||
|
||||
try {
|
||||
await Promise.all(uploadFiles);
|
||||
for (const file of fileinput.files) {
|
||||
await uploadFile(file);
|
||||
}
|
||||
} catch (error) {
|
||||
success = false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user