Tips-1
Salesforceでレコードに画像をアップロードすると、URLが生成されます。このURLには、画像に関連する特定の情報がパラメータとして含まれています。以下の内容では、それぞれのパラメータが何を指しているのかを解説し、画像がどのように管理されているのかをまとめます。
画像URLの構造
例えば、取引先(Account)オブジェクトにリッチテキスト項目を作成し、その項目に画像をアップロードしたとします。
アップロードされた画像のURLは以下のような形式をしています。
http://www.example.com/servlet/rtaImage?eid=a0U30000008KTl4&feoid=00N30000008ck1W&refid=0EM30000000UE2I
このURLのパラメータには、以下の情報が含まれています。
eid
(Entity ID)- 内容: 画像が関連付けられているレコード(カスタムオブジェクトや標準オブジェクト)のIDです。
- 役割: どのレコードに画像が関連付けられているかを識別します。
- 例:
eid=a0U30000008KTl4
→a0U
はカスタムオブジェクトのプレフィックス。
feoid
(Field Entity ID)- 内容: 画像が保存されているリッチテキスト項目のIDです。
- 役割: どの項目に画像が保存されているかを示します。Salesforceの設定画面からこのIDを確認可能です。
- 例:
feoid=00N30000008ck1W
→00N
はカスタム項目のプレフィックス。
refid
(Content Reference ID)- 内容:
ContentReference
型のオブジェクトIDです。Salesforceの内部的なオブジェクトであり、詳細な内容は非公開です。 - 役割: 画像そのものを一意に識別しますが、通常のコードやクエリからは参照できません。
- 例:
refid=0EM30000000UE2I
→0EM
はContentReference
オブジェクトのプレフィックス。
- 内容:
refid
について
refid
はSalesforceのContentReference
型オブジェクトに関連しています。このオブジェクトは非公開であり、次のような制約があります。
ContentReference
オブジェクトは直接クエリやコードからアクセスすることができません。- IDを操作したり、パラメータを変更すると「アクセス権限が不足している」または「画像が見つからない」といったエラーが発生する可能性があります。
以下のスニペットを使用して、refid
のオブジェクトタイプを確認できます。
// 正しいrefidを指定
Id refId = Id.valueOf('0EM30000000UE2I'); // refidを設定
System.debug('正しいrefIdのオブジェクトタイプ: ' + refId.getSObjectType());
// 不正なIDを指定(例: refidの一部を変更)
try {
Id invalidRefId = Id.valueOf('0EM30000000XXXXX'); // 無効なID
System.debug('無効なrefIdのオブジェクトタイプ: ' + invalidRefId.getSObjectType());
} catch (Exception e) {
System.debug('無効なrefIdを指定した場合のエラー: ' + e.getMessage());
}
// refidを操作してアクセスを試みる
try {
Schema.SObjectType sObjectType = refId.getSObjectType();
System.debug('refIdで取得したSObjectType: ' + sObjectType);
System.debug('SObjectTypeをdescribe: ' + sObjectType.getDescribe());
} catch (Exception e) {
System.debug('describeでエラーが発生しました: ' + e.getMessage());
}
ログ
20:01:14:003 USER_DEBUG [17]|DEBUG|SObjectTypeをdescribe: Schema.DescribeSObjectResult[getAssociateEntityType=null;getAssociateParentEntity=null;getDataTranslationEnabled=null;getDefaultImplementation=null;getHasSubtypes=false;getImplementedBy=null;getImplementsInterfaces=null;getIsInterface=false;getIsSubtype=false;getKeyPrefix=0EM;getLabel=Other uploaded images and files;getLabelPlural=Other uploaded images and files;getName=ContentReference;getRecordTypeInfosByDeveloperName={};getSObjectDescribeOption=DEFERRED;isAccessible=false
getName=ContentReference
- オブジェクト名が
ContentReference
であることが確認されました。 - これはSalesforceが内部的に使用しているオブジェクトであり、非公開です。
- オブジェクト名が
getLabel=Other uploaded images and files
- オブジェクトのラベルが「Other uploaded images and files」(その他のアップロードされた画像およびファイル)となっています。
- このオブジェクトが画像やファイルの参照に関連していることを示しています。
isAccessible=false
- このオブジェクトはユーザーからはアクセス不可能であることを示しています。
- クエリや操作を行うことは許可されていません。
getKeyPrefix=0EM
- このオブジェクトのIDプレフィックスが
0EM
であることが確認されました。 - SalesforceのID形式では、プレフィックスがオブジェクトタイプを識別するために使用されます。
- このオブジェクトのIDプレフィックスが
getRecordTypeInfosByDeveloperName={}
- このオブジェクトにはレコードタイプが設定されていないことを示しています。
isAccessible=false
- ユーザーからアクセスできないため、他の項目やデータも確認することはできません。
画像を削除する方法
それぞれの選択肢の理由について説明します。
- レコードを削除
- 画像が格納されているレコードを削除することで、画像も一緒に削除されます。
Id recordId = 'a0U30000008KTl4'; // 関連レコードのID(例: 取引先オブジェクト)
delete [SELECT Id FROM Account WHERE Id = :recordId];
- リッチテキスト項目の内容をクリア
- リッチテキスト項目内の画像をクリアすることで、URLが無効になり画像も間接的に削除されます。
Id recordId = 'a0U30000008KTl4';
Account record = [SELECT Id, RichTextField__c FROM Account WHERE Id = :recordId];
record.richTextField__c = null; // 項目をクリア
update record;
注意事項
- 画像の削除が反映されるタイミング
- Salesforceは画像やファイルのキャッシュを使用している場合があります。削除操作後、キャッシュがクリアされるまでURLが一時的(1日程度)に有効な場合もあります。
- 削除の影響
- レコード全体を削除すると、画像以外のデータも削除されるため、バックアップを取るなど慎重に操作してください。
まとめ
- Salesforceでレコードに画像をアップロードすると、その画像は
ContentReference
オブジェクトに格納されます。 ContentReference
オブジェクト自体はクエリも削除もできないため、画像を削除するには関連するレコードを削除またはリッチテキスト項目をクリアする必要があります。- 選択的に画像だけを削除する方法は標準では提供されていません。
この制約を理解し、画像の管理や削除を行うことが重要です。
コメント