http://masui.net/pukiwiki/ // $Id: attach.inc.php,v 1.7 2002/07/15 07:47:20 masui Exp $ // Last-modified:2002-12-26 (各種バイナリ等への mime 対応実験 / 対応種類は 275-333 行目付近を参照) // modified by 通常の名無しさんの3倍 // 辛抱強くデバッグに協力頂いた http://sogwipo.s17.xrea.com:8080/pukiwiki.php 管理人さんに感謝 //どうもありがとうございました。私もいっちょ貢献しようと一個「.」をくっつけました。--管理者 // set PHP value to enable file upload ini_set("file_uploads","1"); // upload dir(must set end of /) define("UPLOAD_DIR","./attach/"); // max file size for upload on PHP(PHP default 2MB) ini_set("upload_max_filesize","2M"); // max file size for upload on script of PukiWiki(default 1MB) define("MAX_FILESIZE",1000000); // file icon image define("FILE_ICON","\"file\""); function plugin_attach_convert() { global $script,$vars,$max_size; global $_msg_attach_filelist,$_msg_maxsize,$_msg_delete,$_btn_upload,$_btn_delete,$_msg_attachfile; $ret = ""; $decoded_pgname = encode($vars["page"]); $count = 0; $icon = FILE_ICON; if ($dir = @opendir(UPLOAD_DIR)) { while($file = readdir($dir)) { if($file == ".." || $file == ".") continue; if(!preg_match("/^${decoded_pgname}_([^.]+)$/",$file,$match)) continue; $lastmod = date("Y/m/d H:i:s",filemtime(UPLOAD_DIR.$file)); settype($dfile_size,"double"); $dfile_size = round(filesize(UPLOAD_DIR.$file)/1000,1); if($dfile_size == 0) $dfile_size = 0.1; $file_size = sprintf("%01.1f",$dfile_size)."KB"; $filename = decode($match[1]); $filename_url = rawurlencode($filename); $refername_url = rawurlencode($vars[page]); $counter = ''; if(file_exists(UPLOAD_DIR.$file.'.log')) { $list = file(UPLOAD_DIR.$file.'.log'); $counter = ' '; } $del = "[$_btn_delete]"; $open = "$icon$filename$counter\n"; $into = "$open $del"; $attach_files[$lastmod.++$count] = $into; } closedir($dir); @krsort($attach_files); } $max_size = number_format(MAX_FILESIZE/1000); $max_size.= "KB"; $args = func_get_args(); if(is_array($attach_files)) { if($args[0]===FALSE) $ret.= "$_msg_attachfile: "; $ret.= join("\n  ",$attach_files)."\n"; } if($args[0]!==FALSE) { $ret.= "
\n"; $ret.= "
\n"; $ret.= "
\n"; $ret.= "\n"; $ret.= "\n"; $ret.= "\n"; $ret.= "[$_msg_attach_filelist]
\n"; $ret.= "".str_replace('$1',$max_size,$_msg_maxsize)."
\n"; $ret.= "$_msg_attachfile: \n"; $ret.= "
\n"; $ret.= "
\n"; $ret.= "
\n"; } return $ret; } function plugin_attach_action() { global $vars,$script,$max_size,$HTTP_POST_FILES; global $_title_uploaded,$_title_file_deleted,$_title_notfound,$_msg_noparm,$_msg_already_exists,$_msg_attach_filelist,$_msg_delete,$_msg_exceed,$_btn_delete; global $_msg_maxsize,$_btn_upload,$_msg_attachfile,$_title_upload,$_title_confirm_delete,$_msg_confirm_delete; $postfiles = $HTTP_POST_FILES; $icon = FILE_ICON; $vars["mode"] = rawurldecode($vars["mode"]); $vars["openfile"] = rawurldecode($vars["openfile"]); $vars["delfile"] = rawurldecode($vars["delfile"]); $vars["refer"] = rawurldecode($vars["refer"]); if(is_uploaded_file($postfiles["attach_file"]["tmp_name"])) { if($postfiles["attach_file"]["size"] > MAX_FILESIZE) return array("msg" => $_msg_exceed); if(is_freeze($vars["refer"]) || !is_editable($vars["refer"])) return array("msg" => $_msg_noparm); $filename = encode($vars["refer"])."_".encode($postfiles["attach_file"]["name"]); if(file_exists(UPLOAD_DIR.$filename)) return array("msg" => $_msg_already_exists); move_uploaded_file($postfiles["attach_file"]["tmp_name"],UPLOAD_DIR.$filename); if(file_exists(DATA_DIR.encode($vars["refer"]).".txt")) @touch(DATA_DIR.encode($vars["refer"]).".txt"); return array("msg" => $_title_uploaded); } else if($vars["delfile"]) { if($vars["mode"] == "confirm") { $form = "
\n"; $form .= "
\n"; $form .= "\n"; $form .= "\n"; $form .= "\n"; $form .= "\n"; $form .= "
\n"; $form .= "
"; $retvars["body"] = sprintf($_msg_confirm_delete,$vars["delfile"],$form); $retvars["msg"] = sprintf($_title_confirm_delete,$vars["delfile"]); return $retvars; } else { $filename = encode($vars["refer"])."_".encode($vars["delfile"]); if(is_freeze($vars["refer"]) || !is_editable($vars["refer"])) return array("msg" => $_msg_noparm); if(!file_exists(UPLOAD_DIR.$filename)) return array("msg" => $_title_notfound); @unlink(UPLOAD_DIR.$filename); if(file_exists(DATA_DIR.encode($vars["refer"]).".txt")) @touch(DATA_DIR.encode($vars["refer"]).".txt"); return array("msg" => $_title_file_deleted); } } else if($vars["openfile"]) { $filename = encode($vars["refer"])."_".encode($vars["openfile"]); if(!file_exists(UPLOAD_DIR.$filename)) return array("msg" => $_title_notfound); download_file(UPLOAD_DIR.$filename,$vars["openfile"]); die(); } else if($vars["pcmd"] == "list") { if ($dir = @opendir(UPLOAD_DIR)) { $pgname_keep = ""; $retbody = ""; $aryret = array(); $pagenames = array(); while($file = readdir($dir)) { if($file == ".." || $file == "." || strstr($file,".log")!=FALSE) continue; settype($dfile_size,"double"); $dfile_size = round(filesize(UPLOAD_DIR.$file)/1000,1); if($dfile_size == 0) $dfile_size = 0.1; $file_size = sprintf("%01.1f",$dfile_size)."KB"; preg_match("/^([^_]+)_([^_]+)$/",$file,$match); $pagename = decode($match[1]); $pagename_url = rawurlencode($pagename); $filename = decode($match[2]); $filename_url = rawurlencode($filename); $passage = get_pg_passage($pagename); $pagename = strip_bracket($pagename); $pagenames[$pagename] = "
  • $pagename$passage
  • \n"; $lastmod = date("Y/m/d H:i:s",filemtime(UPLOAD_DIR.$file)); $del = "[$_btn_delete]"; $open = "$filename"; $aryret[$pagename] .= "
  • $open $del
  • \n"; } closedir($dir); ksort($aryret); $retbody = ''; foreach($aryret as $pagename => $list) { $retbody .= $pagenames[$pagename] . "\n"; } } $retvars["msg"] = $_msg_attach_filelist; $retvars["body"] = "\n"; if($retbody) $retvars["body"] .= "\n"; return $retvars; } else if($vars["pcmd"] == "upload" && $vars["page"]) { $vars["refer"] = $vars["page"]; $max_size = number_format(MAX_FILESIZE/1000); $max_size.= "KB"; $ret.= "
    \n"; $ret.= "
    \n"; $ret.= "\n"; $ret.= "\n"; $ret.= "\n"; $ret.= "[$_msg_attach_filelist]
    \n"; $ret.= "".str_replace('$1',$max_size,$_msg_maxsize)."
    \n"; $ret.= "$_msg_attachfile: \n"; $ret.= "
    \n"; $ret.= "
    \n"; $ret.= "
    \n"; $retvars["msg"] = $_title_upload; $retvars["body"] = $ret; return $retvars; } } function attach_filelist() { return plugin_attach_convert(FALSE); } function download_file($path_file,$filename) { $content_length = filesize($path_file); $list = array(1); if(file_exists($path_file.'.log')) { $list = file($path_file.'.log'); $list[0] = chop($list[0]) + 1; } $fp = fopen($path_file.'.log','w'); foreach ($list as $l) { fputs($fp,$l); } fclose($fp); // for japanese if(function_exists("mb_convert_encoding")) $filename = mb_convert_encoding($filename,"SJIS","auto"); header("Content-Disposition: inline; filename=\"$filename\""); header("Content-Length: ".$content_length); header("Content-Type: ".attach_SetMimeType($path_file,$filename)); @readfile($path_file); } function attach_SetMimeType($path_file,$filename) { // 無駄ではあるが画像に関しては、内容を確認して特定 $size = getimagesize($path_file); switch ($size[2]) { case 1: return "image/gif"; case 2: return "image/jpeg"; case 3: return "image/png"; case 4: return "application/x-shockwave-flash"; } // 単に拡張子を信じる // ファイル名を詐称されたら終わり switch ( strtolower(substr(strrchr($filename,"."),1)) ) { /* case "gif": return "image/gif"; case "jpg": case "jpeg": return "image/jpeg"; case "png": return "image/png"; case "swf": return "application/x-shockwave-flash"; */ case "pdf": return "application/pdf"; case "mpg": case "mpeg": return "video/mpg"; case "rm": return "application/vnd.rn-realmedia"; case "mov": return "video/quicktime"; case "avi": return "video/avi"; case "wmv": return "video/x-ms-wmv"; case "mp3": return "audio/mp3"; case "wav": case "wave": return "audio/wav"; case "ra": case "ram": return "audio/vnd.rn-realaudio"; case "mid": case "midi": return "audio/midi"; case "zip": return "application/x-zip-compressed"; case "lzh": return "application/x-lzh-compressed"; case "gz": case "tgz": return "application/x-gzip"; case "bz2": case "gz2": return "application/x-bz2-compressed"; case "z": return "application/x-compress"; case "cab": return "application/x-cab-compressed"; case "sit": return "application/x-stuffit"; case "tar": return "application/x-tar"; case "txt": case "text": case "dat": case "jis": case "euc": case "sjis": case "sjs": case "asc": case "utf": case "utf8": case "csv": case "sql": return "text/plain"; case "svg": return "image/svg-xml"; case "exe": return "application/ms-download"; case "doc": return "application/ms-word"; case "xls": return "application/ms-excel"; case "mdb": case "mde": return "application/ms-access"; case "ppt": case "pps": return "application/ms-powerpoint"; default: return "application/octet-stream"; } } ?>