フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成勉強中
9:35
①今日は、バックエンドSpringBootを使ってのファイル保存を調べる。
・画像と同じだとは思うが、とりあえずやってみる。と思ったが、そおだ、画像やファイルのサイズはFlutter側でもチェックしておきたい。し、拡張子もチェックしておきたい。バックエンドに送信して例外発生じゃまずいので。
14:43
①ということで、とりあえずファイル保存の調査を中断して、スマホ画面Flutter側のカメラ、ギャラリーともに1つの共通メソッドにした。これで、汎用的に使用できる。かつ、ファイルサイズチェック、拡張子チェックもやっている。
例として、ファイルサイズ1Mまで(後述consts.dartでは10Mにしてある。もしも1Mならということなので)としたとき、こんなダイヤログが出ます。
②PGMはこんな感じ
■gazo_register_amend.dart
class _GazoRegisterAmendState extends State<GazoRegisterAmend> { ・・・ Widget build(BuildContext context) { ・・・ List<Widget> _makeWidgets() { ・・・ //--テスト画像選択 start---------------------------- contentWidgets.add( Container( margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5), padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0), decoration: CommUtils.commBoxDecoration(), child:Column ( children: <Widget>[ Padding( padding: const EdgeInsets.all(8.0), child: Container( margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5), padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0), child: _gazoForm.gazoFlFile == null ? const Text('画像を選んでください。') : Row(children:[ const Text("画像 : ", textAlign: TextAlign.left, overflow: TextOverflow.clip,), Image.file(_gazoForm.gazoFlFile!, fit: BoxFit.cover, width: 80.0, height: 80.0, alignment: Alignment.centerLeft,) ]), ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ FloatingActionButton( onPressed: () async { File? _file = await CommUtils.getImageFromAnyOne( context, Consts.cameraKbn, Consts.maxFileSize, Consts.imageExt); if (_file != null) { setState(() { _gazoForm.gazoFlFile = _file; }); } }, tooltip: 'Pick Image From Camera', child: const Icon(Icons.add_a_photo), ), FloatingActionButton( onPressed: () async { File? _file = await CommUtils.getImageFromAnyOne( context, Consts.galleryKbn, Consts.maxFileSize, Consts.imageExt); if (_file != null) { setState(() { _gazoForm.gazoFlFile = _file; }); } }, tooltip: 'Pick Image From Gallery', child: const Icon(Icons.photo_library), ), ], ), const SizedBox( height : 10.0, ), ], ), ), ); //--テスト画像選択 end----------------------------
■comm_utils.dart
class CommUtils { ・・・ /// 写真取得及び、画像ファイル読み込み static Future<File?> getImageFromAnyOne(BuildContext _context, String _cameraGalleryKbn, int _maxFileSize, List<String> _fileExt) async { final _picker = ImagePicker(); final XFile? _pickedFile; if (_cameraGalleryKbn == Consts.cameraKbn) { _pickedFile = await _picker.pickImage(source: ImageSource.camera); } else { _pickedFile = await _picker.pickImage(source: ImageSource.gallery); } if (_pickedFile != null) { int _iLength = File(_pickedFile.path).lengthSync(); // ファイルサイズが指定バイト以上のとき if (_iLength > (_maxFileSize * 1000000)) { await CommUtils.openDialogOkComm( _context, "ファイルサイズは${_maxFileSize}Mバイト以下を選んでください。"); } else { String _path = _pickedFile.path.toLowerCase(); bool _flg = false; // 拡張子をチェック for (String _str in _fileExt) { if (_path.endsWith(_str)) { _flg = true; break; } } if (!_flg) { await CommUtils.openDialogOkComm( _context, "登録できない拡張子です。(拡張子は、$_fileExtのみ可能)"); } else { return File(_pickedFile.path); } } } return null; }
■consts.dart
class Consts { ・・・ /// ファイルMAXサイズ。M指定 static const int maxFileSize = 10; /// 画像拡張子 static const List<String> imageExt = [".jpg",".jpeg",".png",".gif",".bmp",".tiff",]; /// ファイル拡張子 static const List<String> fileExt = [".txt",".pdf",]; /// カメラ、ギャラりー区分:カメラ static const String cameraKbn = "camera"; /// カメラ、ギャラりー区分:ギャラりー static const String galleryKbn = "gallery";
■2022/06/15に、勉強した成果:『Flutter_JavaSpringプログラム自動作成◎自動生成ツール』をVectorに載せました。Zenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
・Vector
www.vector.co.jp
・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev