Hi Team,
Using Apex code, I tried to upload a large (>5MB) file in chunks, But the file is getting corrupted always. Please help me. Below is the code.
public class relatedFile {
public String Title;
public string filepath;
public Blob VersionData;
}
@AuraEnabled(cacheable=false)
public static string createFile(List<Map<String, Object>> files, Boolean finalChunk, Integer chunksize, string dpaccessToken, string dpteamMemberId,
string dpfileRootNamespaceId, string dpuploadsession)
{
try{
system.debug('files: '+files);
Map<String, Object> file = files[0];
system.debug('file: '+file);
String fileJson = JSON.serialize(file);
system.debug('fileJson: '+fileJson);
relatedFile relatedDocument = (relatedFile) JSON.deserialize(fileJson, relatedFile.class);
system.debug('relatedDocument.VersionData: '+relatedDocument.VersionData);
system.debug('relatedDocument.filepath: '+relatedDocument.filepath);
system.debug('relatedDocument.Title: '+relatedDocument.Title);
system.debug('finalChunk: '+finalChunk);
system.debug('chunksize: '+chunksize);
system.debug('accessToken: '+dpaccessToken);
system.debug('teamMemberId: '+dpteamMemberId);
system.debug('fileRootNamespaceId: '+dpfileRootNamespaceId);
Blob data = relatedDocument.VersionData;
string uploadfileaccesstoken;
string uploadfileteammemberId;
string uploadfileroot_namespace_id;
string uploadsessionid;
System.debug('createFile');
system.debug('in append data size: '+data.size());
integer size = 0;
system.debug('size: '+size);
if(chunksize==0){
system.debug('in start');
uploadfileaccesstoken = getAccessToken();
system.debug('uploadfileaccesstoken: '+uploadfileaccesstoken);
uploadfileteammemberId= getTeamInfo(uploadfileaccesstoken);
system.debug('teammemberId: '+uploadfileteammemberId);
uploadfileroot_namespace_id = getCurrentAccountInfo(uploadfileaccesstoken,uploadfileteammemberId);
System.debug('root_namespace_id:' + uploadfileroot_namespace_id);
DropBoxSyncWrapper.EndFileRequest createfilereq = new DropBoxSyncWrapper.EndFileRequest();
createfilereq.close = false;
Http httpcreatefile = new Http();
HttpRequest reqcreatefile = new HttpRequest();
String jsoncreatefile = JSON.serialize(createfilereq);
System.debug('jsoncreatefile:' + jsoncreatefile);
reqcreatefile.setHeader('Dropbox-API-Path-Root','{".tag":"root","root":"' + uploadfileroot_namespace_id +'"}');
reqcreatefile.setHeader('Content-Type', 'application/octet-stream');
reqcreatefile.setHeader('Dropbox-API-Arg', JSON.serialize(createfilereq));
reqcreatefile.setHeader('Dropbox-API-Select-User', uploadfileteammemberId);
reqcreatefile.setHeader('Authorization', 'Bearer '+uploadfileaccesstoken);
//reqcreatefile.setBodyAsBlob(data);
reqcreatefile.setMethod('POST');
//reqcreatefile.setEndpoint('callout:DropBox_API_FileCreate/2/files/upload');
reqcreatefile.setEndpoint('callout:DropBox_API_FileCreate/2/files/upload_session/start');
reqcreatefile.setTimeout(120000);
HttpResponse responsecreatefile = httpcreatefile.send(reqcreatefile);
system.debug('responsecreatefile: '+responsecreatefile.getBody());
system.debug('responsecreatefile: '+responsecreatefile.getStatusCode());
DropBoxSyncWrapper.CheckFileResponse respcreatefile = (DropBoxSyncWrapper.CheckFileResponse) JSON.deserialize(
responsecreatefile.getBody(), DropBoxSyncWrapper.CheckFileResponse.class);
System.debug('respcreatefile:' + respcreatefile);
System.debug('respcreatefile.session_id:' + respcreatefile.session_id);
if(responsecreatefile.getStatusCode()!=200){
return 'Start Fail';
}
uploadsessionid = respcreatefile.session_id;
}
else{
uploadfileaccesstoken = dpaccessToken;
uploadfileteammemberId = dpteamMemberId;
uploadfileroot_namespace_id = dpfileRootNamespaceId;
uploadsessionid = dpuploadsession;
}
system.debug('uploadfileaccesstoken: '+uploadfileaccesstoken);
system.debug('uploadfileteammemberId: '+uploadfileteammemberId);
system.debug('uploadfileaccesstoken: '+uploadfileroot_namespace_id);
system.debug('uploadsessionid: '+uploadsessionid);
if(uploadsessionid!=''){
Http httpAppendFile = new Http();
HttpRequest reqAppendFile = new HttpRequest();
reqAppendFile.setEndpoint('callout:DropBox_API_FileCreate/2/files/upload_session/append_v2');
String jsstring1 ='{"cursor":{"session_id":"' + uploadsessionid +'","offset":' + chunksize +'},"close":false}';
System.debug('jsstring1:' + jsstring1);
reqAppendFile.setHeader('Content-Type', 'application/octet-stream');
reqAppendFile.setHeader('Dropbox-API-Path-Root','{".tag":"root","root":"' + uploadfileroot_namespace_id +'"}');
reqAppendFile.setHeader('Dropbox-API-Arg', jsstring1);
reqAppendFile.setHeader('Dropbox-API-Select-User', uploadfileteammemberId);
reqAppendFile.setHeader('Authorization', 'Bearer '+uploadfileaccesstoken);
reqAppendFile.setMethod('POST');
reqAppendFile.setBodyAsBlob(data);
HttpResponse responseAppendFile = httpAppendFile.send(reqAppendFile);
System.debug('responsecreatefile-1:' + responseAppendFile.getStatusCode());
System.debug('responsecreatefile-1:' + responseAppendFile.getBody());
if(responseAppendFile.getStatusCode()!=200){
return 'Append Fail';
}
size = data.size()+chunksize;
system.debug('size: '+size);
}
if(finalChunk){
system.debug('in final chunk');
Http httpUploadFinsh = new Http();
HttpRequest reqUploadFinish = new HttpRequest();
reqUploadFinish.setEndpoint('callout:DropBox_API_FileCreate/2/files/upload_session/finish');
reqUploadFinish.setMethod('POST');
String jsstring2 ='{"cursor":{"session_id":"' +uploadsessionid +'","offset":' + size +'},"commit":{"path":"' +relatedDocument.filepath +'","mode":"add","autorename":true,"mute":false,"strict_conflict":false}}';
System.debug('jsstring2:' + jsstring2);
reqUploadFinish.setHeader('Content-Type', 'application/octet-stream');
reqUploadFinish.setHeader('Dropbox-API-Path-Root','{".tag":"root","root":"' + uploadfileroot_namespace_id +'"}');
reqUploadFinish.setHeader('Dropbox-API-Arg', jsstring2);
reqUploadFinish.setHeader('Dropbox-API-Select-User', uploadfileteammemberId);
reqUploadFinish.setHeader('Authorization', 'Bearer '+uploadfileaccesstoken);
//reqUploadFinish.setBodyAsBlob(data);
HttpResponse responseUploadFinish = httpUploadFinsh.send(reqUploadFinish);
DropBoxSyncWrapper.createFileResponse createfileresp = (DropBoxSyncWrapper.createFileResponse) JSON.deserialize(
responseUploadFinish.getBody(), DropBoxSyncWrapper.createFileResponse.class);
System.debug('responseUploadFinish-2:' + responseUploadFinish.getStatusCode());
System.debug('responseUploadFinish-2:' + responseUploadFinish.getBody());
if(responseUploadFinish.getStatusCode()!=200){
return 'Close Fail';
}
system.debug('createfileresp: '+createfileresp.name);
}
return size+','+uploadfileaccesstoken+','+uploadfileteammemberId+','+uploadfileroot_namespace_id+','+uploadsessionid;
}catch(Exception ex){
Utility.log(true,constant.SystemLogTypes.Callout,'DropBoxSyncHandler','createFile',ex.getMessage(),ex.getStackTraceString(),'','','');
return 'Fail';
}
}
Javascript/LWC code:-
uploadChunk(fileName, fileContents, fromIndex, toIndex,accesstoken,teamMemberId,fileRootNamespaceId,uploadsession){
console.log('In uploadchunk');
var chunk = fileContents.substring(fromIndex, toIndex);
let isFinalChunk = fileContents.length == toIndex ? true: false;
this.filesUploadedtoSalesforce.push({Title: fileName, filepath: this.fileorfolderpath+'/'+fileName,VersionData: chunk});
createFile({
files:this.filesUploadedtoSalesforce,
finalChunk: isFinalChunk, chunksize: this.apexchunkSize, dpaccessToken: accesstoken, dpteamMemberId: teamMemberId,
dpfileRootNamespaceId: fileRootNamespaceId, dpuploadsession: uploadsession
}).then(result => {
console.log('result: '+result);
var resarry = result.split(',');
console.log(resarry);
this.apexchunkSize = parseInt(resarry[0]);
//console.log('this.apexchunkSize: '+this.apexchunkSize);
fromIndex = toIndex;
toIndex = Math.min(fileContents.length, fromIndex + CHUNK_SIZE);
//this.uploadedsize = toIndex;
//let isFinalChunk = fileContents.length == toIndex ? true: false;
if (fromIndex < toIndex) {
console.log('In uploadchunk loop');
this.uploadChunk(fileName, fileContents, fromIndex, toIndex,resarry[1],resarry[2],resarry[3],resarry[4]);
}
}).catch(error => {
})