Salesforce introduced Files related list in Winter’16, and now Salesforce is going to replace Notes and Attachment section with Files. Basically, Files that you upload to the Notes & Attachments related list on records in Salesforce Classic are now Salesforce Files objects, rather than the old attachment objects.
Sometimes you may have requirement to move attachment documents to file using apex. Before creating Files in Salesforce you have to understand the Object relationship. Here is an example to create File from Attachment using apex.
ContentDocument: This object record you don’t have to create. It gets created when you create ContentVersion which is the child of ContentDocument.
ContentVersion: This object stores document information similar like Attachment.
ContentDocumentLink: This object will share the files with Users, Records, Groups etc. You can create multiple records to attach the same files under multiple records.
//Get attachment Attachment attach = [SELECT Id, Name, Body, ContentType, ParentId From Attachment LIMIT 1]; //Insert ContentVersion ContentVersion cVersion = new ContentVersion(); cVersion.ContentLocation = 'S'; //S-Document is in Salesforce. E-Document is outside of Salesforce. L-Document is on a Social Netork. cVersion.PathOnClient = attach.Name;//File name with extention cVersion.Origin = 'H';//C-Content Origin. H-Chatter Origin. cVersion.OwnerId = attach.OwnerId;//Owner of the file cVersion.Title = attach.Name;//Name of the file cVersion.VersionData = attach.Body;//File content Insert cVersion; //After saved the Content Verison, get the ContentDocumentId Id conDocument = [SELECT ContentDocumentId FROM ContentVersion WHERE Id =:cVersion.Id].ContentDocumentId; //Insert ContentDocumentLink ContentDocumentLink cDocLink = new ContentDocumentLink(); cDocLink.ContentDocumentId = conDocument;//Add ContentDocumentId cDocLink.LinkedEntityId = attach.ParentId;//Add attachment parentId cDocLink.ShareType = 'I';//V - Viewer permission. C - Collaborator permission. I - Inferred permission. cDocLink.Visibility = 'InternalUsers';//AllUsers, InternalUsers, SharedUsers Insert cDocLink;