yuu_nkjm blog
2009-08-18(Tue) [長年日記]
[Apache][Webアプリ][w2box] PHPで書かれたファイルアップローダw2boxの日本語環境における設定とカスタマイズ
はじめに
- クライアントPCはWindowsを想定.特にdownloadをShift-JISに変えているあたり.
- langファイルのjaをenに差し替えるのが吉.
- 通常状態だと,インタフェースの日本語が化ける.化けないようにindex.phpのHTMLヘッダの文字コードを"iso-8859-1"から"utf8"に変更すると,日本語ファイル名のファイルがアップロード出来なくなる.
- 初期状態で日本語ファイル名のアップロードは可能
- しかし,アップローダが作成する保存ファイル名が良くない.保存ファイル名の文字コードがUTF8でないため,サーバ上でファイル名が日本語として可読でない.また,保存ファイル名がURLエンコードされていないため,そのファイルへのダウンロードURLがブラウザが解釈できない文字列となってしまう.その結果,ダウンロードした時のファイル名が日本語にならない.
- dataとtmpをwwwrunの持ち物にする.777ではなく755にしないとだめっぽい.
拡張子の制限を外す
拡張子なんでもいけるよってのをconfigファイル中で示す.
$config['allowed_ext'] = array("*");
index.phpの拡張子チェック部分をなくす.
/ if (!in_array(strtolower(extname($filename)), /$config['allowed_ext'])) { / $errormsg = $lang['upload_badext']; / return; / }
w2box.jsの拡張子チェック部分を無効化
if (ALLOWED_TYPES.indexOf(ext) == -1) { / document.getElementById("allowed").className ='red'; / document.getElementById("upload").disabled = true; document.getElementById("allowed").className =''; document.getElementById("upload").disabled = false; } else { document.getElementById("allowed").className =''; document.getElementById("upload").disabled = false; }
ファイルサイズの上限を2Gに上げる
"/home/hoge/uploader/upload.cgi"を編集する.
$high_max_upload = 52428800; #it will be change by params
"will be change"と書いてあるが,更新されない模様.
$high_max_upload = 2048576000; #it will be change by params
としたらうまく行った.
"/home/hoge/uploader/config.php"を編集する.
/ maximum allowed file size in megabytes. $config['max_filesize'] = 2000; / MBytes
"/home/hoge/uploader/.htaccess"を編集する.一番最後の"memory_limit"の設定が重大な障害を引き起こす可能性がありそう.だけど,特定のディレクトリ以下だからいいか.
lv /home/hoge/uploader/.htaccess LimitRequestBody 2048576000 php_value upload_max_filesize 2048576000 php_value post_max_size 2048576000 php_value memory_limit 2048576000 php_value error_log /home/hoge/uploader/php.log
ファイル名を省略しない
index.php 513行目を変更.$maxlenが固定値ならもう少し上の方に書いておいて欲しいところ.
echo '<a href="'.$url.'">';
$maxlen=29;
if ($maxlen>0 && strlen($file['file'])>$maxlen)
/echo substr($file['file'],0,$maxlen-3)."...";
echo $file['file'];
else
echo $file['file'];
echo '';
テーブルのファイル名のカラムの割合を広くする
w2box.cssを変更
table.sortable #th1 {width: 65%;} table.sortable #th2 {width: 13%;} table.sortable #th3 {width: 8%;} table.sortable #th4 {width: 3%;} table.sortable #th5 {width: 2%;}
雑多な設定
"/home/hoge/uploader/config.php"を編集する.
// title of your w2box $config['w2box_title'] = "好きな名前"; // プログレスバー //activate upload progress bar $config['upload_progressbar']=true; // .htaccessでアクセス制限しているのでw2boxではパスワードをかけない // if true, activate admin authentication $config['admin_actived'] = false; // 何かとログは欲しい //--- activity logging -- // if true, log activity to file $config['log'] = true; // アップロードはだいたい2.0GBまでだよ,と. $lang['warning_msg'] ="------------- MAX File Size = about 2.0GB ---------------"
アップロードしたファイルや新規ディレクトリの権限を変更(2009-11-10追記)
同じグループに属するプログラムからごにょごにょしたいので.
//250行目あたり chmod ($filedest, 0775); //280行目あたり chmod($newdir, 0775);
文字コードの変更(2009-11-10追記)
index.phpに手を入れた.日本語ファイル名に対してbasename関数が正しく動作しないようなので,それを回避する.
//405行目あたり
削除の修正.ミスってたら怖い.
function deletefile($cell){ global $config, $lang; //decode str $str=stripslashes(urldecode($cell)); $str=substr($str, strpos($str,'href="')+6); $str=substr($str,0, strpos($str,'"')); if (substr($str,0,10)=="?download=") $str = substr($str,10,strlen($str)); // ディレクトリを削除する時はディレクトリ名だけ,ファイルを削除の時はhttpからなことに注意. $str_tmp = preg_replace('/^http.*\//i','',$str); $file = $config['storage_path'].'/'.$str_tmp; //$file = $config['storage_path'].'/'.basename($str); if (!file_exists($file)) echo $lang['delete_error_notfound']." ($file)"; else { if (is_dir($file)) $return = @rmdir($file); else $return = @unlink($file); if ($config['log_delete']) logadm($lang['DELETE']." ".$file); if ($return) echo "successful"; else { if (is_dir($file)) echo $lang['delete_error_cant_dir']; else echo $lang['delete_error_cant']; } } exit; }
ディレクトリを作成する関数を修正
//make dir if (isset ($_POST['dir'])) { if ($config['protect_makedir']) authorize(); if ($dirlevel < $config['enable_folder_maxdepth']) { `; //この置換では日本語のフォルダが通らん //$newdir = preg_replace("/[^0-9a-zA-Z\(\)\s]/i",'', $_POST['dir']); $newdir =$_POST['dir']; if ($newdir <> "") { $newdir = $config['storage_path']."/".$newdir; if (file_exists($newdir)) $errormsg = $lang['make_error_exist']; else { if (mkdir($newdir)) { // necessary to allow upload files to a new folder // chmod($newdir, 0755); chmod($newdir, 0775); $loc = rooturl(); if (sizeof($dir)>0) $loc .= join("/",$dir)."/"; Header("Location: ".$loc); exit; } else $errormsg = $lang['make_error_cant']; } } } else { $errormsg = $lang['make_error_maxdepth']; } }
アップロード部分を変更.
function uploadfile($file) { global $config, $lang, $max_filesize, $errormsg,$dir; if ($file['error']!=0) { $errormsg = $lang['upload_error'][$file['error']]; return; } //determine filename $filename=$file['name']; if (isset($_POST['filename']) && $_POST['filename']!="") $filename=$_POST['filename']; // $filename=basename($filename); // $filename=explode(".",basename($filename)); // $ext = $filename[count($filename)-1]; // unset($filename[count($filename)-1]); // $filename=join('_',$filename).'.'.$ext; // if (!in_array(strtolower(extname($filename)), $config['allowed_ext'])) { // $errormsg = $lang['upload_badext']; // return; // } $filesize=$file['size']; if ($filesize > $max_filesize) { @unlink($file['tmp_name']); $errormsg = $lang['upload_error_sizelimit'].' ('.getfilesize($max_filesize).').'; return; } $filedest = $config['storage_path'].'/'.$filename; if (file_exists($filedest) && !$config['allow_overwrite']) { @unlink($file['tmp_name']); $errormsg = "$filename ".$lang['upload_error_fileexist']; return; } $filesource=$file['tmp_name']; if (!file_exists($filesource)) { $errormsg = "$filesource do no exist!"; return; } else if (!move_uploaded_file($filesource,$filedest)) { if (!rename($filesource,$filedest)) { $errormsg = $lang['upload_error_nocopy']; return; } } if ($errormsg=="") { // chmod ($filedest, 0755); chmod ($filedest, 0775); if ($config['log_upload']) logadm($lang['UPLOAD'].' '.$filedest); $loc = rooturl(); if (sizeof($dir)>0) $loc .= join("/",$dir)."/"; Header("Location: ".$loc); exit; } }
ダウンロード部を修正.IEへの対応のためにShift-JISで統一した.
function downloadfile($file){ global $config, $lang; // download linkは日本語のまま // $file = $config['storage_path'].'/'.basename($file); $filename = preg_replace('/^http.*\/\?download=/i','',$file); $file = $config['storage_path'].'/'.$filename; if (!is_file($file)) { return; } header("Content-Type: application/octet-stream; charset=Shift-JIS"); header("Content-Size: ".filesize($file)); $filename = mb_convert_encoding($filename, "Shift-JIS", "UTF-8"); header("Content-Disposition: attachment; filename=\"".$filename."\""); header("Content-Length: ".filesize($file)); header("Content-transfer-encoding: binary"); @readfile($file); if ($config['log_download']) logadm($lang['DOWNLOAD'].' '.$file); exit; }
今後の課題
mixi openidに対応したファイルあぷろだの作り方(修正)@labolo : mixiとかopenidでアカウント管理しても良いかもな.
- http://b.hatena.ne.jp/entry/karinto2.jp/uploader/ ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- https://www.google.co.jp/ ×247
- https://www.google.com/ ×26
- http://www.syaneruinkouhyou.com/ ×9
- http://eurohalalfoods.com/Blogs.html ×7
- https://www.google.co.jp/ ×5
- http://b.hatena.ne.jp/yamahalo/w2box/ ×5
- http://threecarhire.co.uk/Blog/BlogViewPagev.aspx ×3
- http://www.instapaper.com/u ×3
- https://www.google.com/search ×3
- http://yuuguukochiinjp.com/ ×3
- https://www.google.co.jp/webhp?sourceid=navclient&h... ×3
- http://b.hatena.ne.jp/zekken5/ ×2
- http://kaoweb.kyoto-su.ac.jp/admin_wiki/index.php?... ×2
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×2
- http://snowlinetravels.com/Blog/BlogViewPagesbn.as... ×2
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- https://www.google.co.id/ ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?q=uploader php&hl=ja... ×1
- https://www.google.com.vn/ ×1
- https://www.google.com.br/ ×1
- http://b.hatena.ne.jp/search/tag?q=w2box ×1
- https://www.google.com/cse?cx=partner-pub-930063932... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=s_d_e_... ×1
- https://www.google.com/webhp?hl=ja ×1
- http://search.fenrir-inc.com/?q=PHP is_dirでWindows... ×1
- w2box ×328 / w2box 日本語 ×98 / w2box 設定 ×67 / w2box 文字化け ×43 / PHP アップローダ unlink ×8 / アップローダ php ×5 / php file_exists 日本語ファイル名 ×4 / php アップローダ ×4 / php アップローダ ファイル名変更 ×4 / php うpろだ ×4 / php uploader ×3 / w2box file ×3 / w2box パスワード ×3 / w2box アップローダー ×3 / w2box progress ×3 / w2box 日本語ファイル名 ×3 / this file uploader is disabled. ×3 / アップローダー 作り方 ×3 / php アップローダ 作り方 ×2 / w2box 日本語 ファイル名 ×2 / PHP アップローダー 作り方 ×2 / w2box サイズ ×2 / PHP アップローダー 拡張子 制限 ×2 / php ファイルアップローダ パスワード ×2 / php makedir 0755 ×2 / W2Box ダウンロード ログ ×2 / アップローダー 日本語 ×2 / php uploader "日本語ファイル名" ×2 / w2box 日本語 設定 php ×2 / w2box PHP アップローダ ×2 / w2box php ×2 / related:phpspot.org/blog/archives/2006/06/phpcoolweb20.html ファイル php アップローダ ×2 / アップローダ utf-8 ×2 / w2box インストール ×2 / file_exists 日本語 ファイル名 ×2 / PHP ファイルアップローダー 日本語 ×2 / W2BOX ×2 / Transfer-Encoding 設定しない php ×2 / w2box, ×2 / w2box php アップローダー ×2 / php アップローダー ×2 / uploader php ×2 / php w2box utf-8 ×2 / uploader php プログレスバー ×2 / w2box 動作環境 ×2 / アップローダー 作成 php ×2 / w2box PHP ×2 / アップローダー ファイル名 変更 ×2 / w2box mod_rewrite ×2 / ファイル アップローダ php ×2 / uploader PHP ×2 / htaccess limitrequestbody ×2 / 64bit アップローダー ×2 / php ファイルアップローダ ×2 / php ファイルアップローダ プログレスバー ×2 / UTF アップローダ ファイル名 ×2 / w2box file size upload ×2 / file uploader php ×2 / ファイルアップロード 2G サーバー PHP ×2 / apache 2Gファイルアップロードできない ×2 / file_exists 日本語ファイル名 ×2 / w2box 化ける ×2 / w2box 修正 ×2 / w2box 日本対応 ×1 / htaccess ファイルサイズ アップローダ ×1 / PHPアップローダー ×1 / アップローダ 作成 ×1 / w2box size ×1 / php アップローダ パスワード ×1 / php アップローダー 1から ×1 / w2box ログ ×1 / php w2box 設定 ×1 / php copy mkdir file_exists encoding ×1 / linux ファイル アップローダ ×1 / php アップローダ win ×1 / upload_max_filesize 変更 2G ×1 / PHP アップローダー IE ファイル名 文字化け ×1 / ファイル アップロード PHP 文字化け IE ×1 / php アップローダー 日本語 ×1 / phpで ディレクトリ名省略 ×1 / php アップローダ 日本語 ×1 / joomla アップローダ ×1 / filesize ファイル名 日本語 ×1 / w2box.js ×1 / php アップローダー コメント ファイル名 ×1 / uploader php web ×1 / phpファイルアップローダー ×1 / ダウンロード ファイル 書かれた 保存形式 ×1 / アップローダ 構築 GB 分割アップロード ×1 / puwiki xls index 日本語名 ×1 / アップローダ php フォルダ作成 ×1 / php アップローダ ファイル名 ×1 / ファイルアップローダー php ×1 / php basename utf8 ×1 / w2box 日本語 文字化 ×1 / apache アップローダ ×1 / アップローダ PHP ファイル名 変えない ×1 / ファイルアップローダー PHP ×1 / ファイルアップローダー php フォルダ ×1 / IE6 header location shift_jis ×1