[SalesForce] How to upload a file to an external data source (e.g. Sharepoint, Google Drive, etc) in Salesforce via Files Connect

How do you upload a file to an external data source (e.g. Sharepoint, Google Drive, etc) in Salesforce via Files Connect? Is this even possible. I've read the Salesforce articles, I've watched a number of videos (from Laurent Kubaski). And they end up just being a way view files stored on the external data source with no way to upload or even edit.

TL;DR;

I'm hoping to be able to upload a file to Sharepoint/GoogleDocs/etc via Salesforce (from an Upload button on the Files tab/page or the RestAPI or even Apex) so that the file gets inserted/uploaded into the external system and a ContentVersion record gets created from that process, linked to that newly created external document.


The closest I've seen to anyone doing this is in this post (Sharepoint Files Connect identifiers in Content Version Object) where he says:

After uploading a Sharepoint file via Salesforce Files Connect, i see a record gets created in Content Version object.

But he doesn't mention how he did it.

The only other articles that even come close are similar to this article (Convert GoogleDoc records to Salesforce Files) where he's adding ContentVersion records linking to existing file in Google Docs but he's doing this because of an apparent change in the Google API:

After April 2015, […] Salesforce changed the integration citing changes to Google’s API. You can now only create bookmarks to the URLs of Google Drive files this way.

So, is it even possible to upload a file in Salesforce that goes directly into an external data source, without:

  1. having two copies of the file data/content (one in Salesforce and the other in the external system)
  2. having to manually insert the file into the external system via a RestAPI call (whatever) and then querying the info of newly inserted file, from the external system, just to add a link in Salesforce.

I've tried to use the Salesforce Rest API to insert (POST) a file into the external data source but it fails with Required fields are missing: [ExternalDocumentInfo2] which is the ID of the file in the external system.

{
"ExternalDataSourceId": "<ExternalDataSourceId>",
"ContentLocation": "E",
"Origin": "H",
"FirstPublishLocationId": "<linkedEntityId>",
"Title": "peter_griffin_face1.jpeg",
"PathOnClient": "peter_griffin_face1.jpeg",
"VersionData": "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"
}

Great, it's the chicken and the egg paradox. But seriously, it looks as though what I'm trying to accomplish isn't possible (unless @learningmode has any magical insight into what I'm doing wrong).

I'm hoping to be able to upload a file to Sharepoint/GoogleDocs/etc via Salesforce (from an Upload button on the Files tab/page or the RestAPI or even Apex) so that the file gets inserted/uploaded into the external system and a ContentVersion record gets created from that process, linked to that newly created external document.

Any help would be greatly appreciated.

Best Answer

This question is taken from the Salesforce Integration Architecture Designer Exam. The answer is allegedly B:

NO.55 Universal Containers (UC) is a large printing company that sells advertisement banners. The company works with third-party agents on banner initial design concepts. The design files are stored in an on-premise file store that can be accessed by UC internal users and the third party agencies. UC would like to collaborate with the 3rd party agencies on the design files and allow them to be able to view the design files in the community. The conceptual design files size is 2.5 GB. Which solution should an integration architect recommend?

(A). Create a lightning component with a Request and Reply integration pattern to allow the
community users to download the design files.
(B). Define an External Data Source and use Salesforce Connect to upload the files to an external object. Link the external object using Indirect lookup.
(C). Create a custom object to store the file location URL, when a community user clicks on the file URL, redirect the user to the on-prem system file location.
(D). Use Salesforce Files to link the files to Salesforce records and display the record and the files in the community. 
Related Topic