💡

自作lwcコンポーネントで画像をアップロード方法のメモ

2022/06/16に公開

前提

・ほとんどの場合で、lightning-file-uploadを使用する方がよい
 https://developer.salesforce.com/docs/component-library/bundle/lightning-file-upload/documentation

・下記のようなユースケース時にファイルアップロードを自作する
 ファイルのアップロード前に画像を加工を行う
 アップロード時に独自の処理を行う

注意点

・Apexのガバナ制限でメモリ(ヒープサイズ)は6MB
 画像のファイルサイズは3MB(くらい)を超えるとヒープエラーとなる
 対応として、lwc(javascript側)で画像のリサイズが必要

コード

Apex

public with sharing class HogeController {
    @AuraEnabled
    public static Void createContentversion(Id recordId, String base64Img) {
        ContentVersion contentVersion = new ContentVersion(
            Title = 'fileTitle',
            VersionData = EncodingUtil.base64Decode(base64Img),
            PathOnClient = '/fileName.jpg',
        );

        insert contentVersion;

        Id contentDocumentId = [SELECT ContentDocumentId FROM ContentVersion WHERE Id = :contentVersion.Id][0].ContentDocumentId;

        insert new ContentDocumentLink(
            ContentDocumentId = ContentDocumentId,
            LinkedEntityId = recordId,
            ShareType = 'I',
            Visibility = 'AllUsers'
        );
    }
}

lwc

<template>
  <input type="file" accept="image/jpg" onchange={changeInputFileHandler} />
</template>
import { LightningElement, api } from 'lwc';
import createContentversion from '@salesforce/apex/HogeController.createContentversion';

export default class HogeComponent extends LightningElement {
  @api recordId = '';

  async changeInputFileHandler(event) {

    const readAsDataURL = (imgFile) => {
      return new Promise((resolve) => {
        const fileReader = new FileReader();
        fileReader.onload = () => {
          resolve(fileReader.result);
        };
        fileReader.readAsDataURL(imgFile);
      });
    };

    const inputImgDataUrl = await readAsDataURL(event.target.files[0]);
    await createContentversion({recordId: this.recordId, base64Img: inputImgDataUrl.split(',')[1]});
  }
}

Discussion