h-ash design works|アッシュデザインワークス

ファイルアップローダー

ファイルアップローダー

シンプルで使い勝手のよい「ファイルアップローダー」を探していたのですが、見つからなかったので自作してみました。
もう少し手を加えたい箇所もありますが、順次改修していこうと思っています(記事内でも説明しておりますが、当ファイルアップローダーを参考にされる場合、セキュリティ面に配慮した上でご活用ください)。

Index

― 目次 ―

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

「ファイルアップローダー」には、以下のような機能を実装します。

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

ファイル構成

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

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

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

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~126行目がJavaScriptの記述です。
こちらには「メッセージ用テキストの処理」「アップロードしたファイルに関する処理」を記述しています。
サーバーリクエストの際「flg=0」というようにパラメータを付与し、サーバーサイドでフラグの値を見て「0=読込」「1=保存」というように処理を分岐させています(処理を分岐させることでファイル数を減らし、エコな作りにしています)。
[補足]
上記のようなCSSを適応することで、最後に掲載している『「ファイルアップローダー」の画面イメージ』のようなUIに仕上がります。
フォントに関しては、好みのWebフォントを使用したり、お好きなfont-familyを適応してください。

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

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

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

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

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

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

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

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

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

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

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

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

[仕様についての補足]
●アップロードできるファイルの種類について
現状、アップロードできるファイルの種類は指定していません。
「アップロードされたファイルをプレビューなどでブラウザ表示させること」が前提ではなく、「PCの指定フォルダにダウンロードさせること」が前提のためです。ブラウザでプレビュー表示させると、スクリプトファイルなどはブラウザで実行できてしまいますので、予期せぬ事態を防ぐためダウンロードと削除機能をメインとし、アップロードできるファイルの種類は制限していません
●ドラッグ & ドロップ時の複数ファイル一括アップロードについて
現状、複数ファイル一括アップロードには対応していません。
画像などを大量に一括アップロードされるとファイル一覧が見ずらくなり管理も大変になります。そのため、ファイル点数が多い場合、全ファイルをフォルダ内に格納し「ZIP圧縮したファイル」をアップロードすることを推奨しています(ファイルアップローダーの画面イメージより、「ファイルアップロード」下の注釈をご参照ください)。

この辺りは、おいおい改修していこうと思います。

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

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