【LANSA Tips】Webページからアップロードする画像ファイルのリサイズ処理
質問
Webページからサーバーモジュールに、アップロードする画像ファイルを、リサイズ(拡大・縮小)する方法を教えてください。
回答
LANSA自体には、画像ファイルをリサイズする処理はありませんが、ウィジェットを使用して、JavaScriptでリサイズが可能です。
以下は、ウィジェット、Webページ、サーバーモジュールのサンプルコードです。
■ウィジェットの定義
ウィジェットタイプ: コントロール
メソッド: ImgConv
パラメータ:
名前: strblob タイプ: 文字列
名前: strWidth タイプ: 文字列
イベント: AfterConv
パラメータ:
名前: ImgUrl タイプ: 文字列
名前: type タイプ: 文字列
ウィジェットの[定義]は下図のようになります。
■ウィジェットのソースコード
//—————————–
// WIDGET-METHOD IMPLEMENTATION
//—————————–
PROTOTYPE.ImgConv = function(strblob, strWidth )
{
var img = document.createElement(“img");
const imgReader = new Image();
const imgWidth = strWidth;
imgReader.onload = () => {
const imgType = imgReader.src.substring(5, imgReader.src.indexOf(';’));
const imgHeight = imgReader.height * (imgWidth / imgReader.width);
const canvas = document.createElement('canvas’);
canvas.width = imgWidth;
canvas.height = imgHeight;
const ctx = canvas.getContext('2d’);
ctx.drawImage(imgReader,0,0,imgWidth,imgHeight);
this.fireAfterConv(canvas.toDataURL(imgType), imgType);
}
imgReader.src = strblob;
return “";
}
■Webページのサンプルコード
Begin_Com Role(*EXTENDS #PRIM_WEB) Theme(#SYS_THEME<MaterialDesignBlue>) Layoutmanager(#LayoutMain)
Define_Com Class(#PRIM_VS.Style) Name(#Style1) Borderbottom(3) Borderleft(3) Borderright(3) Bordertop(3)
Define_Com Class(#PRIM_TBLO) Name(#LayoutMain)
Define_Com Class(#PRIM_TBLO.Column) Name(#LayoutMainColumn1) Displayposition(1) Parent(#LayoutMain)
Define_Com Class(#PRIM_TBLO.Row) Name(#LayoutMainRow1) Displayposition(1) Parent(#LayoutMain) Height(50) Units(Pixels)
Define_Com Class(#PRIM_TBLO.Row) Name(#LayoutMainRow2) Displayposition(2) Parent(#LayoutMain)
Define_Com Class(#PRIM_TBLO.Item) Name(#LayoutMainItem1) Alignment(CenterLeft) Column(#LayoutMainColumn1) Manage(#FilePicker) Parent(#LayoutMain) Row(#LayoutMainRow1) Sizing(None) Flow(Right) Marginleft(20)
Define_Com Class(#PRIM_TBLO.Item) Name(#LayoutMainItem3) Alignment(TopCenter) Column(#LayoutMainColumn1) Manage(#Panel1) Parent(#LayoutMain) Row(#LayoutMainRow2)
Define_Com Class(#PRIM_TBLO.Item) Name(#LayoutMainItem2) Alignment(CenterLeft) Column(#LayoutMainColumn1) Manage(#UploadButton) Parent(#LayoutMain) Row(#LayoutMainRow1) Sizing(None) Flow(Right) Marginleft(20)
Define_Com Class(#PRIM_TBLO.Item) Name(#LayoutMainItem4) Alignment(CenterLeft) Column(#LayoutMainColumn1) Manage(#STD_NUM) Parent(#LayoutMain) Row(#LayoutMainRow1) Sizing(None) Flow(Right) Marginleft(20)
Define_Com Class(#PRIM_TBLO.Item) Name(#LayoutMainItem5) Alignment(CenterLeft) Column(#LayoutMainColumn1) Manage(#ウィジェット名) Parent(#LayoutMain) Row(#LayoutMainRow1) Sizing(None) Flow(Right) Marginleft(20)
Define_Com Class(#PRIM_TBLO) Name(#Layout)
Define_Com Class(#PRIM_TBLO.Column) Name(#LayoutColumn1) Displayposition(1) Parent(#Layout)
Define_Com Class(#PRIM_TBLO.Column) Name(#LayoutColumn2) Displayposition(3) Parent(#Layout)
Define_Com Class(#PRIM_TBLO.Item) Name(#LayoutItem2) Alignment(TopCenter) Column(#LayoutColumn1) Manage(#Panel2) Parent(#Layout) Row(#LayoutRow1)
Define_Com Class(#PRIM_TBLO.Item) Name(#LayoutItem1) Alignment(TopCenter) Column(#LayoutColumn2) Manage(#Panel3) Parent(#Layout) Row(#LayoutRow1)
Define_Com Class(#PRIM_TBLO) Name(#Layout1)
Define_Com Class(#PRIM_TBLO.Row) Name(#Layout1Row1) Displayposition(1) Parent(#Layout1)
Define_Com Class(#PRIM_TBLO.Column) Name(#Layout1Column1) Displayposition(1) Parent(#Layout1)
Define_Com Class(#PRIM_TBLO.Item) Name(#Layout1Item1) Alignment(TopLeft) Column(#Layout1Column1) Manage(#Image) Parent(#Layout1) Row(#Layout1Row1) Sizing(ContentWidthAndHeight) Flow(Down) Margintop(10) Marginleft(10)
Define_Com Class(#PRIM_TBLO) Name(#Layout2)
Define_Com Class(#PRIM_TBLO.Row) Name(#Layout2Row1) Displayposition(1) Parent(#Layout2)
Define_Com Class(#PRIM_TBLO.Column) Name(#Layout2Column1) Displayposition(1) Parent(#Layout2)
Define_Com Class(#PRIM_TBLO.Item) Name(#Layout2Item1) Alignment(TopLeft) Column(#Layout2Column1) Manage(#Image) Parent(#Layout2) Row(#Layout2Row1) Sizing(ContentWidthAndHeight) Flow(Down) Margintop(10) Marginleft(10)
Define_Com Class(#PRIM_TBLO.Item) Name(#Layout2Item2) Alignment(TopLeft) Column(#Layout2Column1) Manage(#ThumImage) Parent(#Layout2) Row(#Layout2Row1) Sizing(ContentWidthAndHeight) Flow(Down) Margintop(10) Marginleft(10)
Define_Com Class(#PRIM_TBLO.ColumnDivider) Name(#LayoutColumnDivider1) Displayposition(2) Parent(#Layout) Width(4)
Define_Com Class(#PRIM_TBLO.Row) Name(#LayoutRow1) Displayposition(1) Parent(#Layout)
Define_Com Class(#PRIM_MD.FilePicker) Name(#FilePicker) Caption('ファイル選択’) Displayposition(2) Left(277) Parent(#COM_OWNER) Tabposition(1) Themedrawstyle('MediumTitle’) Top(7)
Define_Com Class(#PRIM_PANL) Name(#Panel1) Displayposition(3) Left(0) Parent(#COM_OWNER) Tabposition(2) Tabstop(False) Top(50) Height(750) Width(1200) Layoutmanager(#Layout)
Define_Com Class(#PRIM_PANL) Name(#Panel2) Displayposition(1) Left(0) Parent(#Panel1) Tabposition(1) Tabstop(False) Top(0) Height(750) Width(598) Horizontalscroll(True) Verticalscroll(True) Layoutmanager(#Layout1)
Define_Com Class(#PRIM_PANL) Name(#Panel3) Displayposition(2) Left(602) Parent(#Panel1) Tabposition(2) Tabstop(False) Top(0) Height(750) Width(598) Layoutmanager(#Layout2) Horizontalscroll(True) Verticalscroll(True)
Define_Com Class(#PRIM_IMAG) Name(#Image) Displayposition(1) Parent(#Panel2) Tabposition(1) Tabstop(False) Style(#Style1) Height(10) Width(10)
Define_Com Class(#PRIM_IMAG) Name(#ThumImage) Displayposition(1) Parent(#Panel3) Tabposition(1) Tabstop(False) Height(10) Width(10) Style(#Style1)
Define_Com Class(#ウィジェット名) Name(#ウィジェット名) Displayposition(5) Height(30) Left(517) Parent(#COM_OWNER) Tabposition(3) Tabstop(False) Width(23) Visible(False)
Define_Com Class(#PRIM_MD.RaisedButton) Name(#UploadButton) Caption('アップロード’) Displayposition(4) Left(397) Parent(#COM_OWNER) Tabposition(4) Themedrawstyle('MediumAccent’) Top(7)
Define_Com Class(#STD_NUM.Visual) Name(#STD_NUM) Componentversion(1) Displayposition(1) Height(30) Parent(#COM_OWNER) Tabposition(5) Top(10) Usepicklist(False) Width(237) Left(20) Caption('リサイズ横幅(ピクセル)’) Displayalignment(Right) Editalignment(Right) Labeltype(Caption)
* 元画像ファイル
Define Field(#UploadFile1) Reffld(#STD_BLOB)
* リサイズ画像ファイル
Define Field(#UploadFile2) Reffld(#STD_BLOB)
Evtroutine Handling(#COM_OWNER.Initialize)
#STD_NUM := 150
Endroutine
Evtroutine Handling(#FilePicker.FileSelected) File(#File)
#Image.FileName #ThumImage.FileName := *BLANKS
#UploadFile1 #UploadFile2 := *SQLNULL
* 画像以外の拡張子だった場合のエラーチェック
If Cond((#File.MimeType = 'image/jpg’) *Or (#File.MimeType = 'image/jpeg’) *Or (#File.MimeType = 'image/bmp’) *Or (#File.MimeType = 'image/gif’) *Or (#File.MimeType = 'image/png’) *Or (#File.MimeType = *BLANKS))
#Image.FileName := #File.Blob
#UploadFile1 := #File.Blob
* サムネ画像ファイルリサイズ
#ウィジェット名.ImgConv( #File.Blob #STD_NUM.AsString )
Else
#SYS_WEB.Alert Caption('画像ファイルではありません。’)
Endif
Endroutine
* 画像リサイズ後
Evtroutine Handling(#ウィジェット名.AfterConv) Imgurl(#ImgUrl) Type(#type)
Define_Com Class(#STD_NUM) Name(#SplitPosition)
#SplitPosition := #ImgUrl.PositionOf( ',’ )
#UploadFile2 := #SYS_WEB.CreateBlob( #ImgUrl.Substring( (#SplitPosition + 1) ) #type )
#ThumImage.Image <= #sys_appln.Createbitmap( #UploadFile2 )
Endroutine
Evtroutine Handling(#UploadButton.Click)
#COM_OWNER.ImageUpload
Endroutine
Mthroutine Name(ImageUpload)
Define_Com Class(#サーバーモジュール.ImageUpload) Name(#Upload)
#Upload.ExecuteAsync Uploadimage(#UploadFile1) Thumimage(#UploadFile2)
Evtroutine Handling(#Upload.Completed)
Endroutine
Evtroutine Handling(#Upload.Failed)
Endroutine
Endroutine
End_Com
■Webページの実行イメージ
■サーバーモジュールのサンプルコード
Srvroutine Name(ImageUpload)
Field_Map For(*INPUT) Field(#Uploadimage)
Field_Map For(*INPUT) Field(#Thumimage)
Define Field(#Uploadimage) Reffld(#STD_BLOB)
Define Field(#Thumimage) Reffld(#STD_BLOB)
Define_Com Class(#PRIM_ALPH) Name(#FilePath)
Define_Com Class(#PRIM_ALPH) Name(#ThumFilePath)
Define_Com Class(#PRIM_ALPH) Name(#FileName)
Define_Com Class(#PRIM_ALPH) Name(#ThumFileName)
Define_Com Class(#PRIM_ALPH) Name(#returnCode)
#FilePath := *PART_DIR + '\web\vl\Test.jpg’
#FileName := #Uploadimage
#ThumFilePath := *PART_DIR + '\web\vl\ThumTest.jpg’
#ThumFileName := #Thumimage
* アップロード処理
Use Builtin(OV_FILE_SERVICE) With_Args(COPY_FILE #FileName #FilePath) To_Get(#returnCode)
Use Builtin(OV_FILE_SERVICE) With_Args(COPY_FILE #ThumFileName #ThumFilePath) To_Get(#returnCode)
Endroutine
有償の「LANSAテクニカル・ホットライン・サービス」をご契約いただければ、過去データベースの検索から今回ご紹介した以外の技術情報を探すことも出来ます。 「LANSAテクニカル・ホットライン・サービス」のご契約についてはお問い合わせフォーム(https://www.lansa.jp/inquiryform/)よりお問い合わせください。