Upload files in chunks
Info: This documentent primarily focuses on library authors. If you want to integrate Lancer into your application please checkout SDK & Packages page
Important: Please follow the step one before moving forward
API Endpoint
POST /api/upload
Request Payload
Each chunk is uploaded using a FormData
object, which contains:
checksum
: The SHA-156 checksum of the chunk.chunk
: The chunk index (starting from 1).file
: The file chunk.
Chunk Calculation Logic
Files are divided into chunks based on a base chunk size (e.g., 5 MB). Each chunk is uploaded individually.
Example Code
/**
* Calculates the SHA-256 checksum of a file chunk.
* @param {Blob} chunk - The file chunk.
* @returns {Promise<string>} - The hexadecimal checksum.
*/
async function calculateChecksum(chunk) {
const buffer = await chunk.arrayBuffer();
const hashBuffer = await crypto.subtle.digest("SHA-256", buffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
}
Upload Code
const UploadEndpoint = API + "/api/upload";
/**
* Uploads a file in chunks.
* @param {File} file - The file to upload.
* @param {string} sessionToken - The session token from the server.
*/
async function uploadFile(file, sessionToken) {
const baseChunkSize = 5 * 1024 * 1024; // Default chunk size: 5 MB
const chunks = [];
let start = 0;
// Divide file into chunks
while (start < file.size) {
const end = Math.min(start + baseChunkSize, file.size);
chunks.push({ start, end });
start = end;
}
console.log(`Total chunks: ${chunks.length}`);
// Upload each chunk
for (let i = 0; i < chunks.length; i++) {
const { start, end } = chunks[i];
const chunk = file.slice(start, end);
const checksum = await calculateChecksum(chunk);
const formData = new FormData();
formData.append("checksum", checksum);
formData.append("chunk", i + 1); // 1-based index
formData.append("file", chunk);
console.log(`Uploading chunk ${i + 1} (${end - start} bytes)`);
const response = await axios.post(UploadEndpoint, formData, {
headers: {
"x-session-token": sessionToken,
},
});
console.log(`Uploaded chunk ${i + 1}:`, response.data);
}
console.log("All chunks uploaded successfully!");
}
Full Example: Upload a File
Here's how the two steps come together:
async function upload(file) {
try {
// Step 1: Create a session
const sessionToken = await createUploadSession(file);
console.log("Session token:", sessionToken);
// Step 2: Upload the file in chunks
await uploadFile(file, sessionToken);
console.log("File upload complete!");
} catch (error) {
console.error("Upload failed:", error.response?.data || error.message);
}
}