Finally, I figured out the issue.
Go to app launcher ==> Search for "Files"
Go to Library ==> Select the folder you uploaded files
Click on "Manage Members" button
Select the user you logged-in and select the Access
Lastly, make sure the access has "Deliver Content"
How to get the Library Permission:
Setup ==> Library ...
One way to achieve this would be to examine the field metadata on all sObject types that you can access. You are looking for any field that has the base64 data type. That would have a capacity to store file date (in theory at least).
This is true for:
I also found:
Not in Apex. You'd be limited by the heap size of Apex. You would need an external service to read the file, instead. For example, you could write a Heroku service to call the Salesforce REST API, then do the chunking/sending on the Heroku side.
If you're using Files, you are using Salesforce Content. In fact, when you add a Chatter File, the platform is generating a ContentDocument/ContentVersion/ContentDocumentLink just as if you were using those objects directly - in addition to the Chatter post(s).
The model sounds complicated, but it can be relatively simple to use the REST API to insert a File....