Created
November 2, 2021 23:32
-
-
Save jungleeforce/aaf7bb6e67e10173d6542c4d347a149e to your computer and use it in GitHub Desktop.
File migration between Salesforce Orgs using Node.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const jsforce = require("jsforce"); | |
const axios = require("axios"); | |
var FormData = require("form-data"); | |
const getStream = require("get-stream"); | |
const mime = require("mime-types"); | |
const conn = new jsforce.Connection({ | |
loginUrl: "https://login.salesforce.com", | |
}); | |
const username = ""; | |
const password = ""; | |
const main = async () => { | |
await conn.login(username, password); | |
const sourceContentVersionFile = | |
await conn.query(`SELECT Id, Title, ContentSize, VersionData, PathOnClient | |
FROM ContentVersion | |
ORDER BY CreatedDate DESC | |
LIMIT 1`); | |
const contentVersionRecord = sourceContentVersionFile.records[0]; | |
if (contentVersionRecord.ContentSize > 37000000) { | |
// size greater than 37Mb use multipart blob insert. | |
const fileStream = await getFile(contentVersionRecord, false); | |
const formData = createFormData(contentVersionRecord, fileStream); | |
const URL = | |
conn.instanceUrl + "/services/data/v51.0/sobjects/ContentVersion"; | |
await axios({ | |
method: "post", | |
maxContentLength: Infinity, | |
maxBodyLength: Infinity, | |
url: URL, | |
headers: { | |
Authorization: "Bearer " + conn.accessToken, | |
"Content-Type": `multipart/form-data; boundary=\"boundary_string\"`, | |
}, | |
data: formData, | |
}); | |
} else { | |
const base64Body = await getFile(contentVersionRecord, true); | |
await conn.sobject("ContentVersion").insert({ | |
Title: contentVersionRecord.Title, | |
PathOnClient: contentVersionRecord.PathOnClient, | |
VersionData: base64Body, | |
FirstPublishLocationId: "0012w00000rTbXNAA0", //Id to which the content version needs to be linked | |
Origin: "H", | |
}); | |
} | |
}; | |
const getFile = async (data, generateBase64String) => { | |
const file = await axios({ | |
method: "get", | |
url: conn.instanceUrl + data.VersionData, | |
headers: { | |
Authorization: "Bearer " + conn.accessToken, | |
}, | |
responseType: "stream", | |
}); | |
if (generateBase64String) { | |
return await getStream(file.data, { encoding: "base64" }); | |
} else { | |
return file.data; // return the stream; | |
} | |
}; | |
const createFormData = (data, file) => { | |
const contentVersion = { | |
FirstPublishLocationId: "0012w00000rTbXNAA0", | |
Title: data.Title, | |
PathOnClient: data.PathOnClient, | |
Origin: "H", | |
}; | |
const form = new FormData(); | |
form.setBoundary("boundary_string"); | |
form.append("entity_content", JSON.stringify(contentVersion), { | |
contentType: "application/json", | |
}); | |
form.append("VersionData", file, { | |
filename: data.PathOnClient, | |
contentType: mime.lookup(data.PathOnClient), | |
}); | |
return form; | |
}; | |
main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment