Mojolicious::Lite でファイルをアップロード
いつもの Mojolicious::Lite です。
プロトタイピング
今回は、自分が欲しいなーと思っているもの、作りたいなーと漠然と思っているものを雑に作ってみます。
雑なので大穴がそこかしこに。
- 同名のファイルは問答無用で上書き
- アプリを再起動すると、アップロードしたファイルの履歴が飛ぶが、ファイルは残り続ける
ううーん、大穴。
ただ、「欲しいもの」をはっきりさせるとき、手間がかかりそうなのはどこか、何が足りないのか、別のモジュールに切り出せないのか、Perl だけじゃ無理で Javascript 使わないとダメなのはどこか?とか、そういう感覚を得たいんですね。
欲しいものがはっきりすると、実はすでに独立したアプリになってたりする・・・なんてこともあります。
作らずに済むのは良いですが、せっかくなので、それを模倣してみたりとか。楽しいですよね。
こんな感じのディレクトリ構成です。
public/
の中のファイル はテストで上げてみたもの。アップロードしたファイルはこの public
フォルダの中に入ります。
$ tree . ├── myapp.pl └── public ├── temp_cp932.pl ├── 初級テキスト・問題集 解答・解説.pdf └── Mac_MaxCapacity.txt
#!/usr/bin/env perl use Mojolicious::Lite; # ファイルの保存先フォルダがなかったら作成する # Mojolicious::Liteの公開フォルダはデフォルトでは # スクリプトのあるフォルダの中にある public my $save_folder = 'public'; unless ( -d $save_folder ) { mkdir $save_folder; } # アップロードしたファイルの情報を格納する配列リファレンス my $upload_files = []; get '/' => sub { my $c = shift; $c->stash( upload_files => $upload_files ); $c->render( template => 'index' ); }; post '/' => sub { my $c = shift; # form内のファイルのところから情報を持ってくる my $file = $c->param('file_field'); # ファイル移動先のパスを作る my $path = join( "/", $save_folder, $file->filename ); # ファイルを移動する $file->move_to($path); my $localtime = localtime; # ファイル名などを保存する push @{$upload_files}, { filename => $file->filename, size => $file->size, localtime => $localtime, }; # 表示はgetにお任せ $c->redirect_to('/'); }; app->start; __DATA__ @@ index.html.ep % layout 'default'; % title 'Welcome'; <h1>Welcome to the Mojolicious real-time web framework!</h1> <form action="/" method="POST" enctype="multipart/form-data"> <ul> <li>ファイル:<input type="file" name="file_field" required></input> </ul> <input type="submit"></input> </form> <table border="1"> <tr> <th>DL</th> <th>filename</th> <th>size</th> <th>localtime</th> </tr> <% for my $file ( @{$upload_files} ){ %> <tr> <td><a href="<%= $file->{filename} %>">ダウンロード</a> </td> <td><%= $file->{filename} %></td> <td><%= $file->{size} %></td> <td><%= $file->{localtime} %></td> </tr> <% } %> </table> @@ layouts/default.html.ep <!DOCTYPE html> <html> <head><title><%= title %></title></head> <body><%= content %></body> </html>
追記
まぁ、TODO 書くだけならね(できるとは言っていない
追記2
やりたいことが整理された結果、Google Drive 中心にいろいろやれば Mojolicious 使わなくて良さそう感が出てきた