ดาวน์โหลด ContentVersion Object เป็น JPG โดยใช้ JSForce
ฉันพยายามดาวน์โหลดไฟล์ JPG ที่จัดเก็บเป็นไฟล์แนบใน Salesforce ไปยังเครื่องภายใน ฉันมี URL ที่ทำงานได้อย่างถูกต้องเมื่อใช้คำขอ GET ใน Workbench เมื่อฉันพยายามทำเช่นเดียวกันใน Node.JS (โดยใช้ JSForce) ฉันไม่สามารถรับไฟล์เพื่อส่งออกเป็น JPG ได้
นี่คือสิ่งที่ฉันมี:
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');
});
});
ฉันเชื่อว่าคำขอ GET ควรส่งคืนสตริง BASE64 แต่ดูเหมือนจะไม่สามารถแปลงหรือทำให้เป็นประโยชน์ได้
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!
แก้ไข: ฉันพบวิธีแก้ปัญหา Tbh ฉันแค่ต้องการนอนหลับและตื่นขึ้นมาและใช้ Postman เพื่อแก้ไขปัญหาอย่างถูกต้อง
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();
ขอบคุณผู้ที่ช่วยเหลือคุณชี้ให้ฉันเห็นในทิศทางที่ถูกต้อง
คำตอบ
นี่คือตัวอย่างคำขอดึงข้อมูล JS ที่ฉันแปลงในบุรุษไปรษณีย์ (นี่คือรหัสเทียมและอาจใช้ไม่ได้ผล) ฉันใช้จุดสิ้นสุดต่อไปนี้/services/data/v48.0/sobjects/Attachment/<ATTACHMENT_FILE_ID>/Body แต่การตอบสนองเป็นไบนารีดังนั้นคุณจะต้องจัดการการตอบสนองนั้นและแปลงเป็น JPG
https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_blob_retrieve.htm
คุณยังสามารถลองรับเนื้อหาไฟล์ด้วย Connect API และปลายทางต่อไปนี้ (ยังคงตอบสนองแบบไบนารี): /services/data/v{{version}}/connect/files/<FILE_ID>/contentหรือสร้างลิงก์การแชร์ไฟล์สาธารณะที่มีปลายทางต่อไปนี้และใช้ลิงก์นั้นไม่ทางใดก็ทางหนึ่ง (คำขอ 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(...)
จุดสิ้นสุดของ Blob Retrieve ส่งคืนเนื้อหาของไฟล์เป็นไฟล์ไบนารี ไม่จำเป็นต้อง base64 ถอดรหัสค่า ดูเอกสาร
เนื้อหาของไฟล์แนบถูกส่งคืนในรูปแบบไบนารี โปรดทราบว่าประเภทเนื้อหาการตอบกลับจะไม่ใช่ JSON หรือ XML เนื่องจากข้อมูลที่ส่งคืนเป็นไบนารี
หมายเหตุ: นี่ใช้สำหรับเนื้อหาที่แนบมา แต่ยังใช้กับเนื้อหา Blob อื่น ๆ ด้วย
นี่คือตัวอย่างสั้น ๆ ที่ฉันเขียนขึ้น:
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);
});
});