SlideShare a Scribd company logo
1 of 11
Download to read offline
Takashi Hatamoto
訳あってLWCから添付ファイル上げ
ようとした話
VFからLWCまで、実装方法いろいろ
SFDG 運営サブリーダー
自己紹介
畑本 貴史 / Takashi Hatamoto
株式会社チームスピリット
サービスディベロプメント本部
TSFエンジニアリングチーム エキスパート
• Salesforceエンジニア歴14年
• 現職では5年近くAppExchange開発
• Salesforce Developer Group Tokyo 運営メンバー
• Salesforce Saturday Japan (京橋) 主催
• 元Lightning App Dev Champion
• 学生時代は空を飛んでいたらしい・・
前提情報
機能要件
• 画像ファイルをSalesforceにアップロードする画面を作りたい
• 画面はVisualforceで作成する
• 画像ファイルは、添付ファイル[Attachment]として登録する
• 画像ファイルのサイズは最大10MBまで想定する
(Attachmentの上限)
①VisualforceからApexを使ってアップロード
VisualforceのApexコントローラからレコードを登録する
Visualforce側
• バイナリファイルのフォーム登録には以下のいずれ
かを使う
• Input type=“file”(HTML5標準)
• apex:inputFile (VF専用)
• ファイル名とファイルデータをApexに送る
Apex側
• Attachmentオブジェクトを宣言
• ファイル名とファイルデータを登録
// ApexでAttachmentを登録
public saveAttachment(String fileName, Blob fileBody)
{
Attachment attach = new Attachment();
attach.ParentId = 'xxxxxxxxxxxxxxx';
attach.Body = fileBody;
attach.Name = fileName;
insert Attachment;
}
<input type="file" accept="image/*" name="image_file"
id="image_file" ></input>
<apex:inputFile value="{!fileBody}"
filename="{!fileName}"/>
大容量ファイルを上げたときに
ヒープサイズエラーになる!
②Visualforceから「Apexを使わずに」アップロード
“Ajax Toolkit”を用いて、VFのJavaScriptからSOAP
APIを使って接続
https://developer.salesforce.com/docs/atlas.en-us.aj
ax.meta/ajax/sforce_api_ajax_introducing.htm
SOAP APIを用いて38MBまでアップロード可能
Visualforce側
• Ajax Toolkit(connection.js)をロードしておく
• フォームから取得したファイル名とファイルデータを
使ってAttachmentレコードを作成
<script type="text/javascript"
src="/soap/ajax/60.0/connection.js"></script>
<script type="text/javascript">
// Toolkitにセッションを渡す
sforce.connection.sessionId='{!GETSESSIONID()}’;
// ToolkitでAttachentを登録
const attachment = new sforce.SObject("Attachment");
attachment.Name = img.data('filename');
attachment.ContentType = img.data('filetype');
attachment.ParentId = result.cardStatementLineId;
attachment.body = img.attr('src').split(',')[1];
const attachCreateResult =
sforce.connection.create([attachment]);
</script>
この画面、LWCでリファクタリングします!
③LWCからファイルをアップロード
LWCからSalesforceのデータを登録する場合、
以下の手順が考えられる
1. データをApexに送り、Apexから登録(①と同様)
2. lightning/uiRecordApiを使ってJavaScriptから登録
(②と同様)
3. lightning-file-uploadを使う⇒登録した時点でファイ
ルがアップロードされる!
// uiApiをインポート
import { createRecord } from 'lightning/uiRecordApi’;
// uiRecordApiでContentVersionを登録
const fileData={
Title:fileName,
PathOnClient:'file.jpg',
VersionData: fileData
}
const recordInput = {
apiName:'ContentVersion',fields:fileData };
createRecord(recordInput: Record);
<!-- コントローラ処理不要で自動的にアップロードされる -->
<lightning-file-upload
label="ファイルアップロード "
name="fileUploader"
accept=['.jpg','.png']
record-id={parentdId}
onuploadfinished={handleUploadFinished}
multiple
>
</lightning-file-upload>
2,3の方法では[ContentDocument]
オブジェクトとして登録される
⇒[Attachment]は登録できない!?
④LWCからファイル[Attachment]をアップロード
SOAP/REST APIでなら[Attachment]登録できる?
⇒ LWCからAPIアクセスすることはできない!?
• LWC画面から直接Salesforceセッションを取得する
ことはできない
• Apexから(UserInfo)セッションを取得できるが、API
アクセスに使うことはできない
• LWCからのAPIコールはApex経由で行うことが推
奨されている
// uiApiをインポート
import { createRecord } from 'lightning/uiRecordApi’;
// uiRecordApiでCOntentVersionを登録
const fileData={
Title:fileName,
PathOnClient:'file.jpg',
VersionData: fileData
}
const recordInput = {
apiName:'ContentVersion',fields:fileData };
createRecord(recordInput: Record);
<!-- コントローラ処理不要で自動的にアップロードされる -->
<lightning-file-upload
label="ファイルアップロード "
name="fileUploader"
accept=['.jpg','.png']
record-id={parentdId}
onuploadfinished={handleUploadFinished}
multiple
>
</lightning-file-upload>
他の部分からセッションを取得できれば、
あるいは・・・
補足情報:[Attachment]と[ContentDocument]の違い
[Attachment]の特徴
● Classic時代の古いファイルシステム
● データの更新不可
● 親レコードと主従関係で紐づく(移動不可)
○ 紐づけない場合は[Document]を用いる
● ファイルサイズ:上限25MB
○ SFサポートに依頼することで65MBまで拡張可能
○ SOAP APIで送信
[ContentDocument]の特徴
● LEX時代標準の新しいファイルシステム
● データ更新可能
○ [ContentVersion]で更新差分が記録される
● 複数のレコードへの紐づけ・付け替えやユーザ・グループに対する共有設定が可能
○ [ContentDocumentLink]で連結する
● ファイルサイズ:上限2GB
補足情報:[Attachment]と[ContentDocument]の違い
比較表
※より詳細な情報は以下を参照
https://help.salesforce.com/s/articleView?id=sf.collab_files_differences.htm&type=5&language=ja
Attachment Document ContentDocument
実装時期 Classic Classic 最新
データの更新 × ○ ◎
レコードへの紐づけ ○ × ◎
ユーザへの共有 × ○ ◎
ファイルサイズ上限 25MB 5MB 2GB
結論
カスタムコード内でセッションIDを取得してAPIアクセスをする手順や問題については、
こちらで詳しく解説されています。
How to get Session ID for Salesforce managed packages
https://medium.com/noltic/how-to-get-session-id-for-salesforce-managed-packages-533c1a654549
今度何かあったら、
素直に新しいオブジェクト(ContentDocument)を
使いましょう・・・
20240125_SFDG Meetup32寄稿_訳あってLWCから添付ファイル上げようとした話

More Related Content

Similar to 20240125_SFDG Meetup32寄稿_訳あってLWCから添付ファイル上げようとした話

Visualforceでカスタムコンポーネントをつくろう
VisualforceでカスタムコンポーネントをつくろうVisualforceでカスタムコンポーネントをつくろう
VisualforceでカスタムコンポーネントをつくろうYuki Yamaguchi
 
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏Yusuke Hirao
 
Phalcon + AngularJSで作る動画プラットフォーム
Phalcon + AngularJSで作る動画プラットフォームPhalcon + AngularJSで作る動画プラットフォーム
Phalcon + AngularJSで作る動画プラットフォームryo-utsunomiya
 
Salesforce開発のスタート地点で考えたいこと
Salesforce開発のスタート地点で考えたいことSalesforce開発のスタート地点で考えたいこと
Salesforce開発のスタート地点で考えたいことYuki Yamaguchi
 
SFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptx
SFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptxSFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptx
SFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptxToru Inoue
 
Sketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 Autumn
Sketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 AutumnSketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 Autumn
Sketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 AutumnRisako Imai
 
13 power nignt2014_yanase
13 power nignt2014_yanase13 power nignt2014_yanase
13 power nignt2014_yanaseTerraSky
 
Fukuokaphp vol12 talk_20140225
Fukuokaphp vol12 talk_20140225Fukuokaphp vol12 talk_20140225
Fukuokaphp vol12 talk_20140225学 松崎
 
SharePoint Framework アップデート SPFx v1.12.1
SharePoint Framework アップデート SPFx v1.12.1SharePoint Framework アップデート SPFx v1.12.1
SharePoint Framework アップデート SPFx v1.12.1Hiroaki Oikawa
 
ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例
ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例
ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例和紀 岩佐
 
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向SFDG ROOKIES
 
実演 AppExchange アプリケーション ライフサイクル
実演 AppExchange アプリケーション ライフサイクル実演 AppExchange アプリケーション ライフサイクル
実演 AppExchange アプリケーション ライフサイクルTakahiro Kawabata
 
Visual Studio Onlineで実践するDevOps手法
Visual Studio Onlineで実践するDevOps手法Visual Studio Onlineで実践するDevOps手法
Visual Studio Onlineで実践するDevOps手法Takashi Takebayashi
 
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクションTakahiro Okumura
 
Salesforce DUG meetup09 summer15
Salesforce DUG meetup09 summer15Salesforce DUG meetup09 summer15
Salesforce DUG meetup09 summer15Ikou Sanuki
 
はじめてのDreamforce はじめてのLightning
はじめてのDreamforce はじめてのLightningはじめてのDreamforce はじめてのLightning
はじめてのDreamforce はじめてのLightningTaiki Yoshikawa
 
Team foundation serverの新しいビルド
Team foundation serverの新しいビルドTeam foundation serverの新しいビルド
Team foundation serverの新しいビルド__Black
 
セールスフォース的開発メソッドのススメ 須山洋輔
セールスフォース的開発メソッドのススメ 須山洋輔セールスフォース的開発メソッドのススメ 須山洋輔
セールスフォース的開発メソッドのススメ 須山洋輔TerraSky
 
DreamTXセッションから読み解くAI活用の現状と展望
DreamTXセッションから読み解くAI活用の現状と展望DreamTXセッションから読み解くAI活用の現状と展望
DreamTXセッションから読み解くAI活用の現状と展望Takashi Hatamoto
 
Don't Stop Deploying!! SFDX時代のデプロイ体験 リターンズ
Don't Stop Deploying!! SFDX時代のデプロイ体験 リターンズDon't Stop Deploying!! SFDX時代のデプロイ体験 リターンズ
Don't Stop Deploying!! SFDX時代のデプロイ体験 リターンズTakahito Miyamoto
 

Similar to 20240125_SFDG Meetup32寄稿_訳あってLWCから添付ファイル上げようとした話 (20)

Visualforceでカスタムコンポーネントをつくろう
VisualforceでカスタムコンポーネントをつくろうVisualforceでカスタムコンポーネントをつくろう
Visualforceでカスタムコンポーネントをつくろう
 
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
 
Phalcon + AngularJSで作る動画プラットフォーム
Phalcon + AngularJSで作る動画プラットフォームPhalcon + AngularJSで作る動画プラットフォーム
Phalcon + AngularJSで作る動画プラットフォーム
 
Salesforce開発のスタート地点で考えたいこと
Salesforce開発のスタート地点で考えたいことSalesforce開発のスタート地点で考えたいこと
Salesforce開発のスタート地点で考えたいこと
 
SFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptx
SFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptxSFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptx
SFDG_画面フローとLightningWebComponentのハイブリッド開発について.pptx
 
Sketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 Autumn
Sketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 AutumnSketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 Autumn
Sketch VS Photoshop Webデザイン4番勝負 - WCAN 2015 Autumn
 
13 power nignt2014_yanase
13 power nignt2014_yanase13 power nignt2014_yanase
13 power nignt2014_yanase
 
Fukuokaphp vol12 talk_20140225
Fukuokaphp vol12 talk_20140225Fukuokaphp vol12 talk_20140225
Fukuokaphp vol12 talk_20140225
 
SharePoint Framework アップデート SPFx v1.12.1
SharePoint Framework アップデート SPFx v1.12.1SharePoint Framework アップデート SPFx v1.12.1
SharePoint Framework アップデート SPFx v1.12.1
 
ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例
ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例
ICONIXプロセス × FileMaker アジャイルプロジェクト実践事例
 
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
 
実演 AppExchange アプリケーション ライフサイクル
実演 AppExchange アプリケーション ライフサイクル実演 AppExchange アプリケーション ライフサイクル
実演 AppExchange アプリケーション ライフサイクル
 
Visual Studio Onlineで実践するDevOps手法
Visual Studio Onlineで実践するDevOps手法Visual Studio Onlineで実践するDevOps手法
Visual Studio Onlineで実践するDevOps手法
 
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
 
Salesforce DUG meetup09 summer15
Salesforce DUG meetup09 summer15Salesforce DUG meetup09 summer15
Salesforce DUG meetup09 summer15
 
はじめてのDreamforce はじめてのLightning
はじめてのDreamforce はじめてのLightningはじめてのDreamforce はじめてのLightning
はじめてのDreamforce はじめてのLightning
 
Team foundation serverの新しいビルド
Team foundation serverの新しいビルドTeam foundation serverの新しいビルド
Team foundation serverの新しいビルド
 
セールスフォース的開発メソッドのススメ 須山洋輔
セールスフォース的開発メソッドのススメ 須山洋輔セールスフォース的開発メソッドのススメ 須山洋輔
セールスフォース的開発メソッドのススメ 須山洋輔
 
DreamTXセッションから読み解くAI活用の現状と展望
DreamTXセッションから読み解くAI活用の現状と展望DreamTXセッションから読み解くAI活用の現状と展望
DreamTXセッションから読み解くAI活用の現状と展望
 
Don't Stop Deploying!! SFDX時代のデプロイ体験 リターンズ
Don't Stop Deploying!! SFDX時代のデプロイ体験 リターンズDon't Stop Deploying!! SFDX時代のデプロイ体験 リターンズ
Don't Stop Deploying!! SFDX時代のデプロイ体験 リターンズ
 

More from Takashi Hatamoto

20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿
20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿
20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿Takashi Hatamoto
 
20230830_ArchitectGroup_SWTT再演(GraphQL)
20230830_ArchitectGroup_SWTT再演(GraphQL)20230830_ArchitectGroup_SWTT再演(GraphQL)
20230830_ArchitectGroup_SWTT再演(GraphQL)Takashi Hatamoto
 
20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較
20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較
20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較Takashi Hatamoto
 
20221104_しゃべくりforceのおしゃべり用資料
20221104_しゃべくりforceのおしゃべり用資料20221104_しゃべくりforceのおしゃべり用資料
20221104_しゃべくりforceのおしゃべり用資料Takashi Hatamoto
 
Restriction Rules(制限ルール) 調べてみた
Restriction Rules(制限ルール)調べてみたRestriction Rules(制限ルール)調べてみた
Restriction Rules(制限ルール) 調べてみたTakashi Hatamoto
 
LEXモバイルから紐解くSalesforceモバイル史
LEXモバイルから紐解くSalesforceモバイル史LEXモバイルから紐解くSalesforceモバイル史
LEXモバイルから紐解くSalesforceモバイル史Takashi Hatamoto
 
SalesforceにおけるCDC(変更データキャプチャ)の実装・活用法について
SalesforceにおけるCDC(変更データキャプチャ)の実装・活用法についてSalesforceにおけるCDC(変更データキャプチャ)の実装・活用法について
SalesforceにおけるCDC(変更データキャプチャ)の実装・活用法についてTakashi Hatamoto
 
Adminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsAdminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsTakashi Hatamoto
 

More from Takashi Hatamoto (8)

20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿
20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿
20231212_【オンライン開催】SWTT 2023秋 振り返り会 for Arch-寄稿
 
20230830_ArchitectGroup_SWTT再演(GraphQL)
20230830_ArchitectGroup_SWTT再演(GraphQL)20230830_ArchitectGroup_SWTT再演(GraphQL)
20230830_ArchitectGroup_SWTT再演(GraphQL)
 
20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較
20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較
20230424_TDXGG寄稿記事:同期/非同期アーキテクチャの比較
 
20221104_しゃべくりforceのおしゃべり用資料
20221104_しゃべくりforceのおしゃべり用資料20221104_しゃべくりforceのおしゃべり用資料
20221104_しゃべくりforceのおしゃべり用資料
 
Restriction Rules(制限ルール) 調べてみた
Restriction Rules(制限ルール)調べてみたRestriction Rules(制限ルール)調べてみた
Restriction Rules(制限ルール) 調べてみた
 
LEXモバイルから紐解くSalesforceモバイル史
LEXモバイルから紐解くSalesforceモバイル史LEXモバイルから紐解くSalesforceモバイル史
LEXモバイルから紐解くSalesforceモバイル史
 
SalesforceにおけるCDC(変更データキャプチャ)の実装・活用法について
SalesforceにおけるCDC(変更データキャプチャ)の実装・活用法についてSalesforceにおけるCDC(変更データキャプチャ)の実装・活用法について
SalesforceにおけるCDC(変更データキャプチャ)の実装・活用法について
 
Adminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsAdminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発Tips
 

20240125_SFDG Meetup32寄稿_訳あってLWCから添付ファイル上げようとした話