シンプルなファイルアップローダ

投稿者: | 2019年3月24日

現在、自宅では2台のファイルサーバを運用しています。

  • ReadyNAS 31600
    大容量・安定性を重視して市販のNAS製品をチョイス。
  • Banana Pi M1 ClassicLHR-2BRHU3
    あるもので構築した、なんちゃってNAS。
    ReadyNAS より静かなので音楽ファイルなどに利用。

ただ、どちらも常時稼働させているわけではないので、たまに不便に感じることがあります。

そこで簡易的なファイル共有サーバを別途立てることにしました。

ファイル共有サーバ

要件

以下を要件としました。

  • どのデバイスでも使えるよう、Webブラウザで利用できる
    どのPC・タブレットで閲覧するか分からないので、ブラウザで利用できる環境を構築する。
    ※デバイスが変わるたびに設定するのが面倒。
  • チープな環境でも動く
    常時稼働を視野に入れ、SBC(シングルボードコンピュータ)での運用を前提としました。

phpUploader

MITライセンスで公開されているシンプルなアップローダです。

導入

NanoPi NEO(Armbian)に導入することにしました。

アップデート

# apt update
# apt dist-upgrade

ソース取得

phpUploader のソースを取得します。

下記では、tmpディレクトリに保存後、解凍しています。

# wget -P /tmp/ https://github.com/shimosyan/phpUploader/archive/v1.2.tar.gz
Saving to: ‘/tmp/v1.2.tar.gz’

# cd /tmp/
# tar -zxvf /tmp/v1.2.tar.gz 

# ls phpUploader-1.2/
app    config      download.php  MIT-LICENSE.txt
asset  delete.php  index.php     README.md

環境構築

phpUploader に必要な Webサーバ・PHP・SQLite を導入します。

# apt install php php-mbstring php-sqlite3 libapache2-mod-php apache2

The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php
  libapache2-mod-php7.0 libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap liblua5.2-0 libmagic-mgc libmagic1 php php-common
  php-mbstring php7.0 php7.0-cli php7.0-common php7.0-json php7.0-mbstring
  php7.0-opcache php7.0-readline php-sqlite3 php7.0-sqlite3
0 upgraded, 23 newly installed, 0 to remove and 0 not upgraded.

Apache は導入後、自動起動していました。

# systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: 
   Active: active (running) since Mon 2019-03-25 12:43:17 UTC; 2min 7s ago

ソース展開

ドキュメントルート

Apache のドキュメントルートを確認して、phpUploader のソースを移動します。

※今回はドキュメントルート(/var/www/html)の直下に展開しています。

# cat /etc/apache2/sites-available/000-default.conf | grep DocumentRoot
    DocumentRoot /var/www/html

# mv /tmp/phpUploader-1.2/* /var/www/html/

# ls /var/www/html/
app    config      download.php  index.php    README.md
asset  delete.php  index.html    MIT-LICENSE.txt

phpUploader 稼働確認

今回はドキュメントルート直下なので、以下URLでアクセスできます。

  • {SERVER_IPADDR}/
    ※元々ある index.html は削除(あるいは移動)しておく必要があります。

早速エラーになりました。

500 - ディレクトリの作成に失敗しました。

ディレクトリ権限付与

Apacheユーザ(www-data)でディレクトリ・DBファイルを作る必要があるので、オーナーを変更します。

# ls -lhd /var/www/html/
drwxr-xr-x 5 root root 4.0K Mar 25 12:46 /var/www/html/

# chown -R www-data:www-data /var/www/html/

# ls -lhd /var/www/html/
drwxr-xr-x 5 www-data www-data 4.0K Mar 25 12:46 /var/www/html/

再度、アクセスすると問題なく利用できます。

設定など

アップロード可能ファイル

デフォルトではアップロードできるファイル拡張子が固定されています。
実運用では便利だと思いますが、今回は自宅での運用なので制限を外しました。

  • {phpUploader}/app/api/upload.php
# diff -u /tmp/upload.php app/api/upload.php 
--- /tmp/upload.php 2019-03-25 13:01:31.312981674 +0000
+++ app/api/upload.php  2019-03-25 13:02:08.119463172 +0000
@@ -83,10 +83,10 @@
 //ファイル拡張子
 $ext = substr( $_FILES['file']['name'], strrpos( $_FILES['file']['name'], '.') + 1);
 if(in_array(mb_strtolower($ext), $extension) === false){
-  $response = array('status' => 'extension_error', 'ext' => $ext);
-  //JSON形式で出力する
-  echo json_encode( $response );
-  exit;
+#  $response = array('status' => 'extension_error', 'ext' => $ext);
+#  //JSON形式で出力する
+#  echo json_encode( $response );
+#  exit;
 }

アップロードサイズ

アップロード可能サイズは下記ファイルの ‘max_file_size’ と PHP(サーバ)設定の論理積(AND条件)となります。

  • {phpUploader}/config/config.php
    max_file_size
  • php.ini
    memory_limit
    post_max_size
    upload_max_filesize

なお、Armbian-Stretch のデフォルトは以下のようになっていました。

# php -i | grep memory_limit
memory_limit => -1 => -1
# php -i | grep post_max_size
post_max_size => 8M => 8M
# php -i | grep upload_max_filesize
upload_max_filesize => 2M => 2M

画面表示(一部)

config.php では「対応拡張子」として ‘extension’ の配列の中身を表示しています。
上記({phpUploader}/app/api/upload.php)で拡張子制限を外したので、表示を変更しておきます。

# diff -u /tmp/config.php config/config.php 
--- /tmp/config.php 2019-03-25 12:48:26.554078129 +0000
+++ config/config.php   2019-03-25 13:08:57.322387185 +0000
@@ -34,7 +34,7 @@
       'max_file_size'       => 2,

       // アップロードできる拡張子
-      'extension'           => array('zip','rar','lzh'),
+      'extension'           => array('ALL'),

       // データベースディレクトリ
       'db_directory'        => './db',
@@ -49,4 +49,4 @@
       'encrypt_filename'    => false
     );
   }
-}
\ No newline at end of file
+}