Scarica ContentVersion Object come JPG utilizzando JSForce
Sto cercando di scaricare un file JPG archiviato come allegato in Salesforce, sul computer locale. Ho un URL che funziona correttamente quando utilizzo una richiesta GET in Workbench. Quando provo a fare lo stesso in Node.JS (usando JSForce), non riesco a ottenere l'output del file come JPG.
Questo è quello che ho:
var jsforce = require('jsforce');
var conn = new jsforce.Connection();
conn.login('<username>', '<password>', function(err, res) {
if (err) { return console.error(err); }
conn.request('https://<my-dev-ed-instance>.my.salesforce.com/services/data/v42.0/sobjects/ContentVersion/<uuid>/VersionData', function(err, res) {
if (err) { return console.error(err); }
console.log(res);
fs.writeFileSync('2.jpg',res,'base64');
});
});
Credo che la richiesta GET dovrebbe restituire una stringa BASE64, ma non riesco a convertirla o renderla utile.
Qualsiasi aiuto sarebbe molto apprezzato!
EDIT: ho trovato una soluzione. Tbh, avevo davvero solo bisogno di dormire un po 'e di svegliarmi e usare Postman per risolvere correttamente i problemi.
var https = require('follow-redirects').https;
var fs = require('fs');
var options = {
'method': 'GET',
'hostname': '<HOSTNAME>',
'path': '/services/data/v49.0/sobjects/ContentVersion/<UUID>/VersionData',
'headers': {
'Authorization': 'Bearer <TOKEN>',
'Cookie': 'BrowserId=<COOKIE>',
'Content-Type': 'text/plain'
},
'maxRedirects': 20
};
var req = https.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function (chunk) {
var body = Buffer.concat(chunks);
fs.writeFileSync('output.jpg',body,'binary');
});
res.on("error", function (error) {
console.error(error);
});
});
req.end();
Grazie a chi mi ha aiutato, mi hai decisamente indirizzato nella giusta direzione.
Risposte
Ecco una richiesta di recupero JS di esempio che ho convertito in Postman (questo è uno pseudocodice e probabilmente non funzionerà). Uso il seguente endpoint /services/data/v48.0/sobjects/Attachment/<ATTACHMENT_FILE_ID>/Body
MA la risposta è binaria, quindi dovresti gestire quella risposta e convertirla in JPG
https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_blob_retrieve.htm
Puoi anche provare a ottenere il contenuto del file con l'API Connect e il seguente endpoint (risposta ancora binaria): /services/data/v{{version}}/connect/files/<FILE_ID>/content
OPPURE creare un collegamento di condivisione file pubblico con il seguente endpoint e utilizzare quel collegamento in un modo o nell'altro (richiesta PUT):/services/data/v{{version}}/connect/files/<FILE_ID>/file-shares/link
https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_files_content.htm
https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_files_shares_link.htm
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <ACCESS_TOKEN>");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://domain.my.salesforce.com/services/data/v48.0/sobjects/Attachment/<ATTACHMENT_FILE_ID>/Body", requestOptions)
.then(...)
L'endpoint di recupero BLOB restituisce effettivamente il contenuto del file come file binario. Non è necessario decodificare in base64 il valore. Consulta la documentazione .
Il contenuto del corpo dell'allegato viene restituito in formato binario. Tieni presente che il tipo di contenuto della risposta non sarà JSON o XML poiché i dati restituiti sono binari.
Nota: questo è per un corpo allegato, ma si applica anche a qualsiasi altro contenuto BLOB.
Ecco un rapido esempio che ho scritto:
var jsforce = require('jsforce');
var fs = require('fs');
const conn = new jsforce.Connection();
conn.login('<username>', '<password>')
.then(() => {
conn.request('/services/data/v49.0/sobjects/ContentVersion/.../VersionData').then((result) => {
fs.writeFileSync('output.data', result);
});
});