flutter for web でfile pickerを使う
完成イメージ
import 'dart:convert'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: '', theme: ThemeData( primarySwatch: Colors.amber, ), routes: { '/': (_) => App(), }, initialRoute: '/', ); } } class App extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(''), ), floatingActionButton: FloatingActionButton( onPressed: () async { try { final _paths = (await FilePicker.platform.pickFiles( type: FileType.any, allowMultiple: false, withData: true)) ?.files; final data = utf8.decode(_paths.first.bytes); print(data); } on PlatformException catch (e) { print("Unsupported operation" + e.toString()); } catch (ex) { print(ex); } }, ), ); } }
この辺
withData: trueにするのがミソ このフラグを立てることで選択したファイルのbytesにデータが入ってくる。 あとはこのデータがテキストであればよしなにutf8.decodeなりを噛ませればStringとして読み込みできるようになる。
final _paths = (await FilePicker.platform.pickFiles( type: FileType.any, allowMultiple: false, withData: true)) ?.files; final data = utf8.decode(_paths.first.bytes);
mysql 8.0 PDO error
ことはじめ
mysql:8.0にpdoでつなぎに行ったらこんな感じのエラーが出た。
PDOException: PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in /var/app/bin/setup.php on line 19
認証方法が8系から変わった?とのことなので、調べる。
調べた
この記事によると、my.confあたりに
[mysqld] # 略 default-authentication-plugin=mysql_native_password
を追加すると良いとのこと。
解決
mysqlの公式dockerイメージで構築していたので、したのような感じでCMDを渡してあげる。
version: "3.7" services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --default-authentication-plugin=mysql_native_password
補足
- mysqldの設定をコンテナ起動時にCMDから指定の形式で渡すと変更ができる
- 渡せるコマンドは今回の場合だと
docker-compose run db --verbose --help
で確認ができる
Configuration without a cnf file Many configuration options can be passed as flags to mysqld. This will give you the flexibility to customize the container without needing a cnf file. For example, if you want to change the default encoding and collation for all tables to use UTF-8 (utf8mb4) just run the following:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
If you would like to see a complete list of available options, just run:
$ docker run -it --rm mysql:tag --verbose --help
ref
alpine composer
コンポーザーをalpineに楽に入れたい。 (※alpine以外の環境にこの方法で入れて動くかは不明)
結論としては、こんな感じにすればOK
FROM alpine:3.10.3 ENV COMPOSER_HOME /composer ENV COMPOSER_ALLOW_SUPERUSER 1 ENV PATH /composer/vendor/bin:$PATH COPY --from=composer:1.9.1 /usr/bin/composer /usr/bin/composer
解説
composerは公式イメージがあるので、ここから実行ファイルだけ落としてくれば動くみたい。
/usr/binとかに入れておく。
COMPOSER_ALLOW_SUPERUSER 1
これを指定すると、composerをSUPER USERで動かしても怒らなくなる。
alpineはそのままだとSUPER USERで動くので指定している。
実行ユーザーを設定していたりすれば不要なんだろうと思う。
COMPOSER_HOME
指定したディレクトリにcomposerそのものが動作するのに使用するファイル、キャッシュ類が格納される。
応用
ユースケースとして、デプロイ用のイメージでcomposer installをしたいが、アプリ動作時はcomposerが不要になる場合は下記のようにするとイメージが綺麗に保てるのでは(と思っている)。
FROM php:latest COPY --from=composer:1.9.1 /usr/bin/composer /usr/bin/composer WORKDIR /var/some-application COPY ./some-application . RUN composer install --no-dev \ && composer some-application-set-up-script \ && rm -rf /usr/bin/composer /composer