LoginSignup
1
0

Salesforceに大容量ファイルをアップロードする

Last updated at Posted at 2024-02-05

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)

これでうまくアップロードできたことが確認できた。:relaxed:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0