[SalesForce] How to retrieve the file content for a ContentDocument object

Previously, on Salesforce Classic, when a file was uploaded, it was saved on the Attachment object table. This object had the Body field.

On Lightning Experience, however, attachments are stored as Content Documents, a completely different (and arguably more complicated) set of tables.

How can I retrieve the file's body when using Lightning Experience? I mean, through SOQL.

Best Answer

The Content tables are considerably more complex than Attachments. The file content is held in the ContentVersion object; one ContentDocument has one or many versions, as well as an arbitrary number of ContentDocumentLink records connecting it to records to which it is shared.

Supposing that you already have the Id of a ContentDocument attached to some record or another, you can get the relevant file content in SOQL:

SELECT VersionData FROM ContentVersion WHERE ContentDocumentId = :myId AND IsLatest = true

The ContentVersion object reference may be useful.

If you need to acquire files that are attached to a specific object in Salesforce, you'd need to first perform a query against ContentDocumentLink and filter upon LinkedEntityId with the Id of the record-attached-to. The ContentDocumentLink field ContentDocumentId will then let you perform the above query against ContentVersion.