2011年11月30日水曜日

[PHP]ディレクトリの再帰削除処理

要件は以下の感じです。

サブフォルダを含めてファイル、ディレクトリを削除する。
ただし、ルートディレクトリは消したくないケースがある。
また、ファイルの最終更新日時が1日以上経ったものだけ削除する。


  1. function rmdirEx($rootPath , $dirDelete){  
  2.   
  3.  if( !is_dir($rootPath)) return;  
  4.   
  5.  $files = scandir($rootPath);  
  6.   
  7.  foreach($files as $file){  
  8.   if ($file == '.' || $file == '..'continue;  
  9.   $fullpath = $rootPath . DIRECTORY_SEPARATOR . $file;  
  10.   if(is_dir($fullpath)){  
  11.    rmdirEx($fullpath , true );  
  12.   }else{  
  13.    $lastUpdateTime = filemtime($fullpath);  
  14.    //更新日時が1日以上前のファイルのみ削除する  
  15.    if( ($lastUpdateTime + (60 * 60 * 24)) < time())  
  16.     @unlink($fullpath);  
  17.   }  
  18.  }  
  19.  //消せれば消す  
  20.  if$dirDelete) @rmdir($rootPath);  
  21.   
  22. }  

2011年11月29日火曜日

ajaxuploadを使った。

ブラウザで画像を選択したら、非同期でアップロードして画像を表示したくて使いました。
配布サイトここ(Ajax Upload)

最新版は完全に作り直されたらしくて、「File Upload」って名前に変わってます。
これも色々と試したみたのですが、UI周りのカスタマイズがいまいち分からなかった。

オプション設定で、template、fileTemplate、classesの当たりを設定すれば良さそう何だけど、
ドキュメントも少ないし、心が折れてあきらめました。

その点、旧バージョンのajaxuploadはiframeとか使って怪しいけど、素直で使いやすいです。

  1. $(function(){  
  2.  new AjaxUpload('file1', { //input type="file"のid  
  3.   action: 'upload.php'//POSTを処理するphp  
  4.   name: 'PostName',  //phpで$_FILES['PostName']と使う。  
  5.   data: {paramA: 'valueA' ,paramB:'valueB'},  //オプションのデータ。$_POSTで渡される  
  6.   onComplete: function(file, response) {   //アップロード完了時のコールバック  
  7.    var ret = eval( '(' + response + ')' );  //JSONの展開  
  8.    if( ret.success ){  
  9.     $('#imageArea').attr('src', ret.path); //イメージの設定  
  10.    }  
  11.   }  
  12.  });  
  13.   
  14. );  

PHP側はこんな感じです。

  1. //オプションパラメータの受取  
  2. $param = $_POST['paramA'];  
  3. $ret = null;  
  4. $uploaddir = 'D:\\upload\\';  
  5. $filename = basename($_FILES['PostName']['name'])  
  6. $uploadfile = $uploaddir . $filename;  
  7.   
  8. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {  
  9.  $ret = array('success'=>true,'path'=>'/images/' . $filename);  
  10. else {  
  11.  $ret = array('success'=>false);  
  12. }  
  13. echo htmlspecialchars(json_encode($ret), ENT_NOQUOTES);  



2011年11月28日月曜日

電池の寿命

使い始めて約5年。
満タンに充電しても30枚くらい撮ったらバッテリー切れ。
バッテリーの寿命が来たようです。



来年の3月頃には新モデルが出るそうなので、そろそろ買い替えを考えていますが、それまでの間もバッテリーは必要なわけで。。。
価格さんで調べたら、純正品は1万円以上。


高すぎるのでやむなく互換製品を購入しました。
今のところ問題ありません。


2011年11月24日木曜日

[LAMP]ファイルがPOSTされない

画面で数個の画像ファイルをPOSTしたんですけど、サーバー側で受信されていない模様。
トレースログを見たら途中までは処理されて、途中から何も無かったような振る舞いを確認。

つまり、プログラムまでデータが渡っていない。と。

ちょっと調べたらapacheでのpostデータサイズ制限は「LimitRequestBody」で設定らしいです。
httpd.confには当該の記述が無かったので却下。
(デフォルトで無制限?危ないなぁ。。)

次はphp.ini。
それっぽいのいました。
「post_max_size」と「upload_max_filesize」。
upload_max_filesizeは1つ当たりのファイルサイズ上限設定で、post_max_sizeはpostの合計サイズ。

今回は、
upload_max_filesize = 10M
post_max_size = 60M
として、apache再起動で解決でした。

コア php.ini ディレクティブに関する説明

2011年11月16日水曜日

[ASP]配列の代入は値渡し?参照渡し?

ちょっと久しぶりにASP(classic)を触ったら不安になったので確認しました。
文字列が格納された配列を代入した場合、値渡しでした。

  1. dim a,b,c  
  2. a = array("あいう","かきく","さしす")  
  3. '代入  
  4. b = a  
  5.   
  6. 'bの要素を書き換える  
  7. b(1) = "けこ"  
  8.   
  9. for each c in a  
  10.     response.Write(c & "  
  11. ")  
  12. next  
  13. Response.Write( "<hr>")  
  14. for each c in b  
  15.     response.Write(c & "  
  16. ")  
  17. next