長すぎるファイル名の添付ファイルアップロードを抑止する

概要

ファイルの添付時、長すぎる名前のファイルをアップロードできないようにします。「アップロードがエラーになること」「アップロードした後にダウンロードできないファイルになってしまうこと」を防ぎます。

動作確認済みブラウザ

表示例

「長い名前を持つページ/階層1/階層2」というページの「添付」で「あいうえおかきくけこさしすせそたちつてとなにぬねのは.txt」というファイルを選択すると、

ファイル名が長すぎます! 添付できません (261文字 > 最大255文字)
Page: 長い名前を持つページ/階層1/階層2
File: あいうえおかきくけこさしすせそたちつてとなにぬねのは.txt
Internal filename: E995B7E38184E5908DE5898DE38292E68C81
E381A4E3839AE383BCE382B82FE99A8EE5B1A4312FE99A8EE5B1A432_E381
82E38184E38186E38188E3818AE3818BE3818DE3818FE38191E38193E38195
E38197E38199E3819BE3819DE3819FE381A1E381A4E381A6E381A8E381AAE3
81ABE381ACE381ADE381AEE381AF2E747874.log

というメッセージが表示され、[アップロード]ボタンがDisableになり押せなくなります。

変更点

attach.inc.php の attach_showform() を変更する。

説明

アップロードファイル選択時の onchange で JavaScriptによってファイル名を計算する。

変更前

// アップロードフォームを表示 (action時)
function attach_showform()
{
	global $vars, $_attach_messages;

	$page = isset($vars['page']) ? $vars['page'] : '';
	$vars['refer'] = $page;
	$body = attach_form($page);

	return array('msg'=>$_attach_messages['msg_upload'], 'body'=>$body);
}

変更後

// アップロードフォームを表示 (action時)
function attach_showform()
{
	global $vars, $_attach_messages;

	$page = isset($vars['page']) ? $vars['page'] : '';
	$vars['refer'] = $page;
	$body = attach_form($page);

	ob_start();
?>
<script type="text/javascript"><!--
function checkUploadFile() {
	var maxLength = 255;
	function getHexNameString(s) {
		var enc = encodeURIComponent(s);
		var result = '';
		for (var i = 0; i < enc.length; i++) {
			if (enc.substr(i, 1) === '%') {
				result += enc.substr(i + 1, 2);
				i += 2;
			} else {
				var c = enc.charCodeAt(i) + 0x100;
				var cs = c.toString(16);
				result += cs.substr(cs.length - 2, 2).toUpperCase();
			}
		}
		return result;
	}
	function getAttachFileName(p, f) {
		return getHexNameString(p) + '_' + getHexNameString(f) + '.log';
	}
	var submitElement = null;
	var pageName = '';
	var fileLeafName = '';
	var fileE = document.getElementById('_p_attach_file');
	if (fileE.value != '') {
		if (fileE.value.match(/((^)|([\\\/]))([^\\\/]+)$/)) {
			fileLeafName = RegExp.$4;
		}
	}
	var nodes = document.getElementsByTagName('input');
	for (var i = 0; i < nodes.length; i++) {
		var n = nodes[i];
		if (n.name == 'refer' && n.type == 'hidden') {
			pageName = n.value;
		} else if (n.type == 'submit') {
			submitElement = n;
			n.disabled = false;
		}
	}
	var aFileName = getAttachFileName(pageName, fileLeafName);
	var nameLength = aFileName.length;
	if (nameLength > maxLength) {
		submitElement.disabled = true;
	} else {
		submitElement.disabled = false;
	}
	var warnLabelId = '___warnLabel';
	var warnLabel = document.getElementById(warnLabelId);
	if (warnLabel) {
		while (warnLabel.hasChildNodes()) {
			warnLabel.removeChild(warnLabel.lastChild);
		}
	} else {
		warnLabel =  document.createElement('span');
		warnLabel.id = warnLabelId;
	}
	if (nameLength > maxLength) {
		 warnLabel.appendChild(document.createElement('br'));
		var expLabel = 'ファイル名が長すぎます! 添付できません (' 
			+ nameLength + '文字 > 最大' + maxLength + '文字)';
		warnLabel.appendChild(document.createTextNode(expLabel));
		warnLabel.appendChild(document.createElement('br'));
		warnLabel.appendChild(document.createTextNode('Page: ' + pageName));
		warnLabel.appendChild(document.createElement('br'));
		warnLabel.appendChild(document.createTextNode('File: ' + fileLeafName));
		warnLabel.appendChild(document.createElement('br'));
		warnLabel.appendChild(document.createTextNode('Internal filename: ' + aFileName));
		warnLabel.style.color = 'red';
		warnLabel.style.fontWeight = '';
	}
	var fileEnext = fileE.nextSibling;
	fileE.parentNode.insertBefore(warnLabel, fileEnext);
}
function __attach_toolongfilename_onload() {
	var fileE = document.getElementById('_p_attach_file');
       if (fileE) {
               fileE.onchange = checkUploadFile;
       }
}
if (window.addEventListener) window.addEventListener("load", __attach_toolongfilename_onload, false);
if (window.attachEvent) window.attachEvent("onload", __attach_toolongfilename_onload);
// -->
</script>
<?php
	$js = ob_get_contents();
	ob_end_clean();
	$body = $js . $body;
	return array('msg'=>$_attach_messages['msg_upload'], 'body'=>$body);
}

関連

コメント



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-03-21 (月) 20:46:39
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.600 sec.

SourceForge