Reputation: 23
I'm developing a Django 1.11 app serving as a UI for some Salesforce Objects using django-salesforce
for the communication with Salesforce.
I have to give users the option to download files from Salesforce Attachment objects related to their Contact.
# Django Attachment model on my_app/models.py
...
class Attachment(models.Model):
parent = models.ForeignKey(Contact, models.DO_NOTHING,
sf_read_only=models.NOT_UPDATEABLE)
name = models.CharField(max_length=255, verbose_name='File Name')
content_type = models.CharField(max_length=120, blank=True, null=True)
body_length = models.IntegerField(sf_read_only=models.READ_ONLY)
body = models.TextField()
...
On this Attachment model I can access the rest URL for the file content on the body
field, but not the actual content.
Is there a way of getting file content from the Attachment without having to implement an OAuth client just for this?
Upvotes: 0
Views: 2005
Reputation: 4262
Salesforce has a dedicated endpoint to stream blob of file
{{endpoint}}/services/data/v{{version}}/connect/files/{{file_id}}/content
Parameters:
Upvotes: 0
Reputation: 15568
A) by REST API request encapsulated by handle_api_exceptions
from salesforce.backend.driver import handle_api_exceptions
# from salesforce.dbapi.driver import handle_api_exceptions # can be changed soon to this
from django.db import connections
session = connections['salesforce'].sf_session
rows = Attachment.objects.filter(...)
for row in rows:
url = session.auth.instance_url + row.body
blob = handle_api_exceptions(url, session.get).text
B) You can get SOAP client (requires Beatbox) by
from salesforce.utils import get_soap_client
import base64
soap = get_soap_client('salesforce')
for ...:
ret = soap.query("SELECT Body FROM Attachment WHERE Id = '...'")
blob = base64.b64decode(ret)[0]['Body'])
Useful related answers are:
EDIT I expect that you mean User = some Contact, not a Contact necessarily related to SFDC object User with some form of paid license. They should download only through your site, not directly, for security reasons. Any OAuth can not probably improve it.
Upvotes: 1