最近趣味でデジタルフォトアルバムのホームページを作っているのですが、写真のアップロードは一度に複数のファイルを転送できるようにしたいと思い
調べてみたところSWFUploadというFlashを使うと出来るようなので使ってみました。
最新版を落として色々試してとりあえず見かけは思い通りのページが出来たのですがいくつか問題がありました。
ひとつはIEで動かない点、もうひとつはアップロードしたファイルの日付がアップロード時刻になってしまう点です。
IEで動かないという問題はv2.5.0 Alpha coreのswfupload.jsに問題があったので修正しました。
具体的にはSWFUpload.prototype.callFlashという関数の
if (movieElement && movieElement.CallFunction) {
というif文で例外が発生して正常に動作しません。
try~catchで囲われているのでIE上ではエラーの表示もされないので少しデバッグしづらいですが、if文で判断せずに中の2行を実行するようにすればIEで動くようになります。
実際のコードは
try{ if (movieElement && movieElement.CallFunction) { returnString = movieElement.CallFunction('' + __flash__argumentsToXML(argumentArray, 0) + ''); returnValue = eval(returnString); } else { this.debug("Can't call flash because the movie wasn't found."); } }catch(ex){ }
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
try{ returnString = movieElement.CallFunction('' + __flash__argumentsToXML(argumentArray, 0) + ''); returnValue = eval(returnString); }catch(ex){ }
こんな感じになります。
アップロードしたファイルのタイムスタンプがアップロード時刻になってしまう点ですが
フラッシュのソースを探してみたところ
this.js_object.creationdate = this.file_reference.creationDate || new Date(0);
という一行を見つけました。
post_paramsに設定したいところですがpost_paramsはオブジェクト作成時にビルドされるので
アップロードするファイル毎にパラメータを設定は出来ません。
良さそうな関数が無いかとjavascriptのソースを眺めていたら
addPostParam
removePostParam
という関数があったので
handlers.jsのuploadStartの中で
removePostParam(“hiduke”);
addPostParam(“hiduke”,file.creationdate);
を入れておくことでサーバサイドにファイルのタイムスタンプを伝えることが出来ました
あとはphpのtouchコマンドを使って
touch($filename,strtotime($_REQUEST[hiduke]));
とやればファイルのタイムスタンプがクライアントのファイルの更新時間と同じになります。