sironekotoroの日記

Perl で楽をしたい

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 書くだけならね(できるとは言っていない

f:id:sironekotoro:20200524173910p:plain

追記2

やりたいことが整理された結果、Google Drive 中心にいろいろやれば Mojolicious 使わなくて良さそう感が出てきた