--- plugin/attach.inc.php.orig 2005-06-26 18:51:38.000000000 +0900 +++ plugin/attach.inc.php 2005-07-15 20:38:08.000000000 +0900 @@ -1,7 +1,9 @@ http://home.arino.jp/ // 2002 Y.MASUI http://masui.net/pukiwiki/ @@ -33,6 +35,15 @@ define('PLUGIN_ATTACH_FILE_MODE', 0644); //define('PLUGIN_ATTACH_FILE_MODE', 0604); // for XREA.COM +// サムネイルのクオリティ (JPEG圧縮時に使用) +define('PLUGIN_THUMB_QUAL', 50); // 0〜100 + +// サムネイルの変換方法 (TRUE:全て滑らかなJPEGに変換, FALSE:JPEGは滑らかなJPEGにその他はPNGに変換) +define('PLUGIN_THUMB_RESAMPLE_ALL', TRUE); // TRUE or FALSE + +// ファイルオープンの場合、直リンを弾く (TRUEにすると「対象をファイルに保存」も出来なくなる) +define('PLUGIN_OPEN_AVOID_DIRECT', FALSE); // TRUE or FALSE + // File icon image define('PLUGIN_ATTACH_FILE_ICON', 'file$_attach_messages['err_adminpass']); } - $obj = & new AttachFile($page, $file['name']); + if (strcasecmp(substr($file['name'],-4), '.tar') == 0 && $vars['untar_mode'] == 'on') { + // UploadされたTarアーカイブを展開添付する + + // Tarファイル展開 + $etars = untar($file['tmp_name'], UPLOAD_DIR); + + // 展開されたファイルを全てアップロードファイルとして追加 + foreach ($etars as $efile ) { + $res = do_upload($page, + mb_convert_encoding($efile['extname'], SOURCE_ENCODING, 'auto'), + $efile['tmpname']); + if (! $res['result'] ) { + unlink($efile['tmpname']); + } + } + + // 最後の返り値でreturn + return $res; + } else { + // 通常の単一ファイル添付処理 + return do_upload($page, $file['name'], $file['tmp_name']); + } +} + +// attach_uploadから呼ばれるファイルアップロード関数 +function do_upload($page, $fname, $tmpname) +{ + global $_attach_messages; + + $obj = & new AttachFile($page, $fname); + if ($obj->exist) return array('result'=>FALSE, 'msg'=>$_attach_messages['err_exists']); - if (move_uploaded_file($file['tmp_name'], $obj->filename)) - chmod($obj->filename, PLUGIN_ATTACH_FILE_MODE); + if (is_uploaded_file($tmpname)) { + if (move_uploaded_file($tmpname, $obj->filename)) { + chmod($obj->filename, PLUGIN_ATTACH_FILE_MODE); + } + } else { + if (rename($tmpname, $obj->filename)) { + chmod($obj->filename, PLUGIN_ATTACH_FILE_MODE); + } + } if (is_page($page)) touch(get_filename($page)); @@ -281,12 +344,39 @@ ${$var} = isset($vars[$var]) ? $vars[$var] : ''; } + if (PLUGIN_OPEN_AVOID_DIRECT && ! strstr($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'])) { + header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']); + exit; + } + $obj = & new AttachFile($refer, $file, $age); return $obj->getstatus() ? $obj->open() : array('msg'=>$_attach_messages['err_notfound']); } +// イメージサムネイル出力 +function attach_thumb() +{ + global $vars, $_attach_messages; + + foreach (array('refer', 'file', 'age') as $var) { + ${$var} = isset($vars[$var]) ? $vars[$var] : ''; + } + + if (PLUGIN_OPEN_AVOID_DIRECT && ! strstr($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'])) { + header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']); + exit; + } + + $obj = & new AttachFile($refer, $file, $age); + + $dstw = $vars['width'] ? $vars['width'] : 0; + $dsth = $vars['height'] ? $vars['height'] : 0; + + return $obj->getstatus() ? $obj->thumb($dstw, $dsth) : array('msg'=>$_attach_messages['err_notfound']); +} + // 一覧取得 function attach_list() { @@ -395,6 +485,7 @@ $pass + ({$_attach_messages['msg_untar']}:) EOD; @@ -659,6 +750,111 @@ @readfile($this->filename); exit; } + + function thumb($dw, $dh) + { + global $vars; + + // for japanese (???) + $filename = htmlspecialchars(mb_convert_encoding($this->file, 'SJIS', 'auto')); + + $thumbname = CACHE_DIR . encode($vars['refer']) . '_' . $dw . 'x' . $dh . '_' . $vars['thumb'] . '.thumb'; + + // サムネイルを出力 + if ((is_readable($thumbname)) && (filemtime($thumbname) > filemtime($this->filename))) { + if (PLUGIN_THUMB_RESAMPLE_ALL) { + $thumb = imagecreatefromjpeg($thumbname); + header('Content-Type: image/jpeg'); + imagejpeg($thumb); + } else { + switch ($type = strtolower(substr($thumbname, strrpos(substr($thumbname, 0, -6), '.') + 1, -6))) { + case 'jpeg': + case 'jpg': + $thumb = imagecreatefromjpeg($thumbname); + header('Content-Type: image/jpeg'); + imagejpeg($thumb); + break; + default: + $thumb = imagecreatefrompng($thumbname); + header('Content-Type: image/png'); + imagepng($thumb); + break; + } + } + exit; + } + + switch ($type = strtolower(substr($filename,strrpos($filename, '.') + 1))) { + case 'jpeg': + case 'jpg': + $src = imagecreatefromjpeg($this->filename); + break; + case 'png': + $src = imagecreatefrompng($this->filename); + break; + case 'bmp': + $src = imagecreatefromwbmp($this->filename); + break; + case 'gif': + $src = imagecreatefromgif($this->filename); + break; + default: + exit; + } + + if (! $src) { + exit; + } + + $sw = imagesx($src); + $sh = imagesy($src); + + if ($dw == 0 && $dh > 0) { + $dw = (int)($sw * $dh / $sh); + } + if ($dh == 0 && $dw > 0) { + $dh = (int)($sh * $dw / $sw); + } + if ($dw == 0 && $dh == 0) { + $dw = $sw; + $dh = $sh; + } + $dst = imagecreatetruecolor($dw, $dh); + + switch ( $type ) { + case 'jpeg': + case 'jpg': + imagecopyresampled($dst, $src, 0, 0, 0, 0, $dw, $dh, $sw, $sh); + imageinterlace($dst, 1); + header('Content-Type: image/jpeg'); + imagejpeg($dst, '', PLUGIN_THUMB_QUAL); + imagejpeg($dst, $thumbname, PLUGIN_THUMB_QUAL); + break; + case 'png': + case 'bmp': + case 'gif': + if (PLUGIN_THUMB_RESAMPLE_ALL) { + imagecopyresampled($dst, $src, 0, 0, 0, 0, $dw, $dh, $sw, $sh); + imageinterlace($dst, 1); + header('Content-Type: image/jpeg'); + imagejpeg($dst, '', PLUGIN_THUMB_QUAL); + imagejpeg($dst, $thumbname, PLUGIN_THUMB_QUAL); + } else { + $alpha = imagecolorallocate($dst, 255, 255, 255); // 色の作成 + imagefill($dst, 0, 0, $alpha); // 指定色で塗りつぶし + imagecolortransparent($dst, $alpha); // 指定色を透明色に + imagecolordeallocate($dst, $alpha); // 色リソースの開放 + imagesavealpha($dst, TRUE); + imagecopyresized($dst, $src, 0, 0, 0, 0, $dw, $dh, $sw, $sh); + imageinterlace($dst, 1); + header('Content-Type: image/png'); + imagepng($dst); + imagepng($dst, $thumbname); + } + break; + } + exit; + } } // ファイルコンテナ @@ -787,4 +983,49 @@ return "\n" . '' . "\n"; } } + +// $tname: tarファイルネーム +// $odir : 展開先ディレクトリ +// 返り値: 特に無し。大したチェックはせず、やるだけやって後は野となれ山となれ +function untar($tname, $odir) +{ + if (! ($fp = fopen($tname, 'rb'))) { + return; + } + + unset($files); + $cnt = 0; + while (strlen($buff = fread($fp, PLUGIN_TAR_HDR_LEN)) == PLUGIN_TAR_HDR_LEN) { + for ($i = PLUGIN_TAR_HDR_NAME_OFFSET, $name = ''; + $buff[$i] != "\0" && $i < PLUGIN_TAR_HDR_NAME_OFFSET+PLUGIN_TAR_HDR_NAME_LEN; $i++) { + $name .= $buff[$i]; + } + $name = basename(trim($name)); //ディレクトリお構い無し + + for ($i = PLUGIN_TAR_HDR_SIZE_OFFSET, $size = ''; + $i < PLUGIN_TAR_HDR_SIZE_OFFSET+PLUGIN_TAR_HDR_SIZE_LEN; $i++) { + $size .= $buff[$i]; + } + list($size) = sscanf('0' . trim($size), '%i'); // サイズは8進数 + + // データブロックは512byteでパディングされている + $pdsz = ((int)(($size + (PLUGIN_TAR_BLK_LEN - 1)) / PLUGIN_TAR_BLK_LEN)) * PLUGIN_TAR_BLK_LEN; + + // 通常のファイルしか相手にしない + $type = $buff[PLUGIN_TAR_HDR_TYPE_OFFSET]; + + if ($name && $type == 0) { + $buff = fread($fp, $pdsz); + $tname = tempnam($odir, 'tar'); + $fpw = fopen($tname , 'wb'); + fwrite($fpw, $buff, $size); + fclose($fpw); + $files[$cnt ]['tmpname'] = $tname; + $files[$cnt++]['extname'] = $name; + } + } + fclose($fp); + + return $files; +} ?> --- plugin/ref.inc.php.orig 2005-05-28 22:31:57.000000000 +0900 +++ plugin/ref.inc.php 2005-07-15 20:38:17.000000000 +0900 @@ -1,6 +1,10 @@ FALSE, // 元ファイルへのリンクを張らない 'noimg' => FALSE, // 画像を展開しない 'zoom' => FALSE, // 縦横比を保持する + 'nothumb'=> FALSE, // サムネイルを使わない '_size' => FALSE, // サイズ指定あり '_w' => 0, // 幅 '_h' => 0, // 高さ @@ -264,9 +269,14 @@ // URI for in-line image output if (! PLUGIN_REF_DIRECT_ACCESS) { - // With ref plugin (faster than attach) - $url = $script . '?plugin=ref' . '&page=' . rawurlencode($page) . - '&src=' . rawurlencode($name); // Show its filename at the last + if ($params['nothumb']) { + // With ref plugin (faster than attach) + $url = $script . '?plugin=ref' . '&page=' . rawurlencode($page) . + '&src=' . rawurlencode($name); // Show its filename at the last + } else { + $url = $script . '?plugin=attach' . '&thumb=' . rawurlencode($name) . + '&refer=' . rawurlencode($page); + } } else { // Try direct-access, if possible $url = $file; @@ -332,6 +342,15 @@ $height = (int)($height * $params['_%'] / 100); } if ($width && $height) $info = "width=\"$width\" height=\"$height\" "; + + if (! $params['nothumb'] && ! is_url($name)) { + if ($width) { + $url .= '&width=' . $width; + } + if ($height) { + $url .= '&height=' . $height; + } + } } // アラインメント判定 --- ja.lng.php.orig 2005-06-16 00:57:11.000000000 +0900 +++ ja.lng.php 2005-07-14 10:30:32.000000000 +0900 @@ -179,7 +179,8 @@ 'err_adminpass'=> '管理者パスワードが一致しません。', 'btn_upload' => 'アップロード', 'btn_info' => '詳細', - 'btn_submit' => '実行' + 'btn_submit' => '実行', + 'msg_untar' => 'tarアーカイブを展開して添付' ); /////////////////////////////////////// --- en.lng.php.orig 2005-06-16 00:57:11.000000000 +0900 +++ en.lng.php 2005-07-14 10:31:45.000000000 +0900 @@ -177,7 +177,8 @@ 'err_adminpass'=> 'Wrong administrator password', 'btn_upload' => 'Upload', 'btn_info' => 'Information', - 'btn_submit' => 'Submit' + 'btn_submit' => 'Submit', + 'msg_untar' => 'Untar & attach' ); ///////////////////////////////////////