h-ash design works|アッシュデザインワークス
Home > News > Blog > ファイルアップローダー Ver.2.0

ファイルアップローダー Ver.2.0

ファイルアップローダー Ver.2.0
ファイルアップローダー Ver.2.0
以前、Blog記事内で「自作のファイルアップローダー」をご紹介しましたが、今回、その仕様を少しバージョンアップしましたので、改めて「ファイルアップローダー Ver.2.0」としてご紹介します(記事内でも説明しておりますが、当ファイルアップローダーを参考にされる場合、セキュリティ面に配慮した上でご活用ください)。

Index

― 目次 ―

「ファイルアップローダー」の仕様について

「ファイルアップローダー」には、以下のような機能を実装します。
今回バージョンアップした点は、以下の3点です。

  1. 複数ファイルの一括アップロードに対応
  2. SP(モバイル端末)でのアップロードにも対応
  3. セキュリティ対策
仕様について
  • 「ファイルアップローダー」のディレクトリにBasic認証を設置
    「ファイルアップローダー」にアクセスする際、セキュリティ面を考慮し、SSLで暗号化された領域内にBasic認証を設置
     ユーザー名とパスワードを入力した場合のみアクセス可能とする
  • 「ファイルアップローダー」内にメッセージ機能を実装
     アップロードしたファイルに関する補足説明を登録できるように「メッセージ入力欄」を設置。
  • ファイル一覧に表示される内容
    ファイル名、ダウンロードボタン、削除ボタンの3つを表示。
    ファイル名には、アップロード日時が分かるように「ファイル名の先頭に年・月・日・時間・分・秒のタイムスタンプを自動的に付与」。
    表示順序は「新しいファイル順」とする
  • アップロードの方法:PCとSP(モバイル端末)でアップロード方法を切り分ける
    PCの場合:「ファイルをドラッグ & ドロップしてアップロードする形」とする。
    SP(モバイル端末)の場合:「ファイル参照ボタンよりファイルを選択してアップロードする形」とする。
    SP(モバイル端末)の場合「ファイルアップロードエリアをタップするとファイル選択画面が出る」仕様とする
    複数ファイルの一括アップロードに対応
  • 検証ブラウザ
    Google Chrome(2026.6.2時点での最新バージョン:149.0.7827.54)

ファイル構成

「ファイルアップローダー」のファイル構成は、以下のような感じです。

▼ファイル構成のイメージ画像

「ファイルアップローダー」のファイル構成

uploaderディレクトリ内に「ファイルアップローダーに必要なファイル一式」を格納します。

  • .htaccessファイル
    Basic認証に必要なファイル
    セキュリティ面を考慮し、.htpasswdファイルは、ブラウザからアクセスできる領域とは別の領域に設置
  • uploadディレクトリ
    アップロードファイルの格納ディレクトリ
    このディレクトリ内にメッセージ文保存用の「message.txt」も格納
  • index.html
    ブラウザ表示用のhtmlファイル
    URL/uploader/にアクセス → ファイルアップローダーのページ
  • uploader.css
    UI(ユーザーインターフェース)編集用のCSSファイル
  • ajax.js
    Ajax通信用のJavaScripファイル
  • uploader.php
    サーバー側の処理を行うphpファイル
    設定を変更したい場合はこちらを編集

HTML・CSS・JavaScript(Ajax)・PHPなどの参考ソース

「ファイルアップローダー」に必要なHTML・CSS・JavaScript(Ajax)・PHPなどについて説明していきます。
前提として、uploaderディレクトリ以下は、Basic認証でアクセスを制限してください。
Basic認証については、参考できるWebサイトが多数あり、Webサーバーを利用されている方向けに「指定ディレクトリ以下へのアクセス制限機能」が付加されている場合もありますので、本記事内での説明は割愛します。
セキュリティ面を考慮して「SSLで暗号化された領域内にBasic認証を設置」「.htpasswdファイルは、ブラウザからアクセスできる領域とは別の領域に設置」「1つのユーザー名とパスワードを複数名で使いまわすのではなく、各自に発行」するようにしてください

[補足]
6行目が外部CSSファイルへのパス指定(UI編集用のCSSファイル)。

7行目が外部JavaScriptファイルのパス指定(Ajax通信用のJavaScripファイル)。

8~220行目がJavaScriptの記述。
ここでの処理は、主に「メッセージ用テキストの処理」「端末の判定(PC or Mobile)と表示の切り替え処理」「アップロードしたファイルに関する処理」「セキュリティ対策としての処理」を行っています。
サーバーリクエストの際「flg=0」というようにパラメータを付与し、サーバーサイドでフラグの値を見て「0=読込」「1=保存」というように処理を分岐させています(処理を分岐させることでファイル数を減らし、エコな作りにしています)。
また、HTML文字列の動的組み立てではなく、ブラウザの安全なAPI(document.createElementやtextContent)を使って安全にDOMを構築する方式を採用しています。
[補足]
上記のようなCSSを適応することで、最後に掲載している『「ファイルアップローダー」の画面イメージ』のようなUIに仕上がります。
フォントに関しては、好みのWebフォントを使用したり、お好きなfont-familyを適応してください。

27~35行目が「border-box」プロパティに関する記述です。
テキストエリアなどにボーダーを適応すると「テキストエリアのサイズ=横幅(高さ)」ではなくなりますので(ボーダー幅の分サイズが合わなくなる)、「サイズが合わないことにより横スクロールが発生する」原因となります。そのため「border-boxプロパティを全ての要素に適用し、横幅・高さのサイズ調整」を行います。

83~94行目が「隣接するセルのボーダーを重ねて表示」を指定。
これは、私が以前よりよく利用している手法で、合わせて「th・tr・tdのボーダー・横幅・表示位置などを調整」してやることで、table関連のタグを制御することができます。

127~130行目は「message.txt」の表示に関連してきます。
後程説明する「uploader.php」の記述を見ていただくと分かるかと思いますが、現状だと「メッセージ文の内容を保存するmessage.txtもファイル一覧に表示される」ようになっています。「message.txtファイルをダウンロード・削除できる」といったメリットもありますが、削除すると「メッセージ保存用のテキストファイル」をアップロードしてくださいとエラーが出力されるようにしていますので、CSSの類似クラスで非表示にしています。この場合「trに適応したクラスdisplay_noneに対して、nth-child(2)という類似クラスを使用」しています。これは「trの2つ目=テーブルの2行目」を意味しますので、「1つ目に表示されるファイル名(message.txt)を非表示にする」ということになります(こちらに関しては、PHP側をカスタマイズしたり、CSS側をカスタマイズして削除ボタンだけ非表示にするなど、お好きに編集してみてください)。
[補足]
Ajax通信を行うためのスクリプトです

30~55行目がクエリパラメータの文字列を作成するメソッド。
パラメータ数→通信種別により変化→引数が可変長引数(arguments変数)になる

57~107行目がAjax通信を実行するメソッド(jQueryではなく、素のJavaScriptでAjax通信を処理)。
第5引数funcNameでメソッド名を渡す→サーバーからのデータ受信後evalメソッドを実行→指定した引数(文字列)のメソッドを実行できる
[補足]
3~4行目が「メッセージの保存先とファイル名」を指定。

5~6行目が「ファイルのアップロード先」を指定。

30~48行目が「アップロードファイル」の保存に関する処理(複数ファイル一括アップロードに対応)。
42~43行目が「ファイル名の先頭にアップロード日時を追加」(「年.月.日-時間:分:秒_ファイル名.拡張子」となります)。
ファイル名の先頭にアップロード日時のタイムスタンプを自動的に付与することで「アップロード日時をファイルから知ることがでる(わざわざ管理画面を見なくても済みます)」「同名ファイルアップロード時の上書きを防ぐことができる」などのメリットがあります

52行目が「ファイル一覧を降順(アップロード日時が新しい順)で表示」。
ファイル名の先頭にアップロード日時のタイムスタンプを自動的に付与し、rsort()関数でファイル一覧を降順で表示することで、「アップロード日時が新しい順」に並びます
タイムスタンプがズレる場合、PHPのデフォルトタイムゾーンをご確認ください
 → php.iniを編集

「ファイルアップローダー」の画面イメージ

「ファイルアップローダー」の完成イメージは、以下のような感じです。

▼ファイルアップローダーの画面イメージ

ファイルアップローダーの画面イメージ

▼スマートフォンでのファイルアップロード箇所の画面イメージ

スマートフォンでのファイルアップロード箇所の画面イメージ

[仕様についての補足]
●アップロードできるファイルの種類について
現状、アップロードできるファイルの種類は指定していません。
そのため、セキュリティ対策として「upload」ディレクトリ内には、以下を記述した.htaccessをアップロードしておきましょう

[補足]
こちらは、PHPやCGIなどのファイルがアップロードされている場合、ブラウザ経由でスクリプトが実行されるのを禁止するためのものです。

1~9行目が「サーバー全体の設定やバグで『アクセス拒否』をすり抜けてファイルが読み込まれてしまった場合の対策」です。
RemoveHandlerとRemoveTypeで「サーバーに対して、このディレクトリ内では.phpという拡張子をプログラム(PHP)として扱わず、単なるテキストファイルとして扱う」ように命令しています。
この命令によって「ファイルが開かれてしまった場合にも、PHPのコードは実行されず、単なる文字列として表示されるだけ(無害化)」になります。

11~25行目が「ブラウザから指定した拡張子のファイルへ直接アクセスされた時点で、サーバーが『閲覧禁止(403 Forbidden)』」を返します。
また「将来どんな数字のPHPバージョンが登場したとしても自動的にマッチする仕組み」を有しています。
[参考]
・php:通常の.phpにマッチ
・php\d+:「\d+」は、1文字以上の数字=php9、php10、php100などにマッチ
その他「Require all denied」・・・Apache 2.4以降、「Deny from all」・・・Apache 2.2系(古いサーバー)に対して条件分岐を行っているため、サーバーが将来アップデートされた場合でもエラーを起こさず動き続けます。

27~31行目が「PHP以外のプログラム言語(Perl・Python・シェルスクリプトなど)がアップロードされ、CGI(サーバー上で動くプログラム)として実行されてしまうのを禁止する命令」です。
頭に「-(マイナス)」を付けることで、CGIの実行権限を完全にオフにします。

上記に該当するのファイルは、ダウンロードもできなくなります
zip圧縮したフォルダ内に上記に該当するファイルがある場合、ダウンロードは可能です
●複数ファイル一括アップロードについて
画像などを大量に一括アップロードされるとファイル一覧が見ずらくなり管理も大変になります。
ファイル点数が多い場合は、全ファイルをフォルダ内に格納し「zip圧縮したファイル」をアップロードすることを推奨しています。

今回は「ファイルアップローダー Ver.2.0」についてご紹介しました。
制作時の参考になりましたら幸いです。

キーワード関連キーワード