フォト アルバムを含む CMS を構築しました。非常にシンプルで、ほとんどが静的で静的な HTML ページであり、データベースはなく、(できるだけ少ない) JSON 要素を含むテキスト ファイルのみです。管理パネルの Web インターフェイスはすべて、PHP (Zend Framework) ベースのバックエンドを使用する jQuery で構成されています。可能な限りブラウザ内で行われるため、バックエンドはほとんどありません。現在、フォト アルバムは次のように機能します。
- リンク「メディア」をクリック
- すべてのアルバムとすべてのアルバムのすべての写真を含むオブジェクトを含む JSON 文字列をバックエンドからフェッチする
- すべてのアルバムを含む順序付けられていないリストのレンダリング
- すべての写真を含む各アルバム リスト アイテム内の順序付けられていないリストのレンダリング
アップロード中:
- 1 つまたは複数の jpeg/png ファイルをブラウザにドロップして、新しいアルバムを作成します
- 1 つまたは複数の jpeg/png ファイルをアルバムにドロップして、それらのファイルをカーソルの下のアルバムに追加します
- ドロップされたすべてのファイルを (このjQuery ドラッグ ドロップ アップロード プラグインを使用して) バックエンドに送信します。
- バックエンドはすべてのファイルを受け取ります (素敵な進行状況バーを表示しながら)
- バックエンドはアップロードされたすべてのファイルをループしますが、Web インターフェイスには素敵なスピナーが表示されます
- 各ファイルは指定された最大サイズにサイズ変更され、最大 133x133 ピクセルでサムネイルがレンダリングされます
- 各ファイルは、サーバー側のファイル名とサムネイル名を含む配列に追加されます
- [未実装: アルバム概要と各画像の (更新された) 静的 HTML ページのレンダリング]
- 新しくアップロードされたすべてのファイルを含む配列が JSON に変換され、クライアントに送信されます
- Webinterface はすべての新しいファイルをリスト項目として追加します (サムネイルを表示)
- アップロード完了
+- 600 枚の画像または +- 900MB まで、これはすべてうまくいっています。ユーザーがより多くのファイルを一度にアップロードしたい場合は、2 段階で行います。問題は、バックエンド処理が面倒だということです。適切なサイズ (各 1.5 MB) の 100 以上の画像を最大サイズに変換し、サムネイルを生成するには時間がかかります。私はPHP GDでこれをやっています。それが問題であることを見つけるのに、あまり時間はかかりませんでした (またはまったく時間もかかりませんでした)。私の推測では、PHP 内でこれを高速化する方法はありません。
そこで、いくつか質問があります:
- ImageMagick は高速になりますか? 私はファンではないので、いいえ、サーバーにこれをインストールしたくありません..
- ほんの数コマンドで同じことを行う本当に軽量のコマンドライン プログラムはありますか (ImageMagick のことをほのめかしているわけではないことはわかっています)。
- 前の質問に対する答えが「いいえ」の場合: これを行う最善の方法は何ですか? Java とは言わないでください。私はそれほど Java のファンでもありません。いくつかのC(-方言)?できれば、最近傍、双一次および双三次補間アルゴリズム用の強力で軽量な画像ライブラリを備えたもの。
- アーキテクチャを変更できますか? この時点で、サムネイルが挿入されるとブラウザに画像が表示され始めます。つまり、JSON 配列全体が受信された後、ブラウザでなんらかのフィードバックが受信される前に、アクション全体を完了してすべての画像データを生成する必要があります。これは、スピナーが (プロセスにかかる時間や完了した画像の数を示すことなく) 長時間表示されることを意味します。Javascripts FileReader を使用してユーザーのシステムから画像をプリロードし、ブラウザでサムネイルを生成し、アップロードがすぐに完了した後にそれらを表示するという考えはありますか? バックエンドでは、ファイルを受信してディスクに書き込み、コマンドライン コマンドを実行して、すぐにブラウザに応答を送信し、バックグラウンドで変換しますか?
- AJAX リクエストのクライアント側アボート イベントを防ぐにはどうすればよいですか? アップロードして変換するとき、ユーザーがページを閉じたいとき、または #hash を変更しようとしているときに、警告が表示される必要があります。
ありがとう。皆さんが私を助けてくれることを願っています。クライアント側は非常に複雑で、多くのコードが必要です。バックエンドを変えたほうがいいです。