Salesforce Filesを利用して大容量ファイルをアップロードできるが、APIを利用するときは制約がある。
ContentVersion Object
https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_contentversion.htm
SOAP API を使用してアップロードできるファイルの最大サイズは 50 MB です。ドキュメントが API を使用してアップロードまたはダウンロードされると、base64 に変換され、VersionData に格納されます。この変換により、ドキュメントサイズは約 37% 増加します。アップロードする予定のファイルが変換後に 50 MB 未満になるように base64 変換による増加を考慮します。
Blob データを挿入または更新する
https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/dome_sobject_insert_update_blob.htm
You can insert or update blob data using a non-multipart message, but if you do, you are limited to 50 MB of text data or 37.5 MB of base64–encoded data.
要するに、50MB制限を突破するためには以下の条件が必要
- REST APIを利用する
- Requestをmultipart/form-data形式で送信する
この記事ではSimple-Salesforceを利用して、ファイルをアップロードしてみる。
試験環境
- Python 3.10
- simple-salesforce 1.12.5
- Salesforce API Version V57以上 (Winter'23)
アプロードするコード
現在ディレクトリに50MB以上のlargefile.zip
が存在していると仮定する。
import os
import pprint
from simple_salesforce import Salesforce
from simple_salesforce import format_soql
import datetime
import base64
import json
def create_version_large_file(sf, filename, title=None):
"""Salesforceに50MB以上のファイルをアップロードする
Args:
sf (Salesforce): simple_salesforceインスタンス
filename (string): アップロードするファイル名
title (string, optional): Salesforceにアップロードする際のファイル名
"""
if title is None:
title = filename
url = '{}sobjects/ContentVersion'.format(sf.base_url)
metadata = json.dumps({
'Title': title,
'PathOnClient': filename,
})
with open(filename, 'rb') as f:
content = f.read()
files = [
('entity_content', ('', metadata, 'application/json')),
('VersionData', (filename, content, 'application/octet-stream'))
]
headers = {
'Authorization': sf.headers['Authorization'],
}
response = sf.session.post(url=url, headers=headers, files=files)
json_response = response.json()
version_id = json_response['id']
return version_id
# Salesforce接続情報
username = '<ユーザ名>'
password = '<パスワード>'
security_token = '<セキュリティトークン>'
# Simple-Salesforceインスタンスを作成
sf = Salesforce(username=username, password=password, security_token=security_token)
# アップロードするファイル名
filename = 'largefile.zip'
result = create_version_large_file(sf, filename)
print('アップロード結果:', result)
これでうまくアップロードできたことが確認できた。