kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

フロント側を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