ホームページ >php教程 >php手册 >PHPを使用したファイルアップロードの具体的な考え方と実装

PHPを使用したファイルアップロードの具体的な考え方と実装

WBOY
WBOYオリジナル
2016-06-21 08:59:48739ブラウズ

  文件上传我们需要用到HTML里面表单的type=file类型,及其enctype属性。这是我们大家必须要用的。当然了PHP函数库当中的FILE函数库,字符串类型函数库,目录函数库及$_FILES[]的使用是我们必须要用到的。

  也许每一个站点都可能会对上传文件有许多的限制,这些限制会包括 文件类型,文件大小,扩展名,以及上传目录的存在与否,上传文件的存在与否,目录的可写性,可读性,上传文件的改名及怎样把文件从缓存当中复制到你所需要的目录当中。

  当然出错的预处理也是我们不容忽视的!如果再深一步的讨论我们还可以对文件的操作起用事件日志的记录。

  下面我们通过一段程序来实现这些功能:
  
  首先是我们预设的变量值,它包括文件大小,文件扩展名类型,MIMI类型,及是否删除的开关变量

$MAX_SIZE = 2000000;
$FILE_MIMES = array('image/jpeg','image/jpg','image/gif'
,'image/png','application/msword');

$FILE_EXTS = array('.zip','.jpg','.png','.gif');

$DELETABLE = true;

  下一部就是设置浏览器访问变量及目录访问变量:

$site_name = $_SERVER['HTTP_HOST'];
$url_dir = http://.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
$url_this = http://.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

$upload_dir = files/;
$upload_url = $url_dir./files/;
$message =;

  建立上传目录并相应改变权限:

if (!is_dir(files)) {
 if (!mkdir($upload_dir))
  die (upload_files directory doesn't exist and creation failed);
 if (!chmod($upload_dir,0755))
  die (change permission to 755 failed.);
}

用人要求の処理:


if ($_REQUEST[del] && $DELETABLE) {
$resource = fopen(log.txt,a);
fwrite($resource,date(Ymd h:i:s).DELETE - $_SERVER[REMOTE_ADDR].$_REQUEST[del]\n);
fclose($resource);

if (strpos ($_REQUEST[del],/.)>0); //ハッキングの可能性
else if (strpos($_REQUEST[del],files/) === false); //ハッキングの可能性
else if (substr($_REQUEST[del],0,6)==files/) {
unlink($_REQUEST[del]);
print <script>window.location .href='$url_this?message=削除に成功しました'</script>;<br/> }<br/>}<br/>else if ($_FILES['userfile']) {<br/> $resource = fopen(log. txt,a);<br/> fwrite($resource,date(Ymd h:i:s).UPLOAD - $_SERVER[REMOTE_ADDR]<br/> .$_FILES['userfile']['name'].<br/> .$_FILES['userfile']['type'].\n);<br/> fclose($resource);<br/><br/> $file_type = $_FILES['userfile']['type']; <br/> $file_name = $_FILES['userfile']['name'];<br/> $file_ext = strto lower(substr($file_name,strrpos($file_name,.)));<br/><br/> //文件大小的检查:<br/><br/> if ( $_FILES['userfile']['size'] > $MAX_SIZE) <br/> $message = ファイルサイズが 2MB を超えています。;<br/> //ファイルタイプ/拡張子チェック<br/> else if (!in_array($file_type, $FILE_MIMES) <br/>&& !in_array($file_ext, $FILE_EXTS) )<br/> $message = 申し訳ありませんが、$file_name($file_type) は許可されていません;<br/> else<br/> $message = do_upload($upload_dir, $upload_url);<br/><br/> print <script>window.location.href='$url_this?message=$message'</ script>;<br/>}<br/>else if (!$_FILES['userfile']);<br/>else <br/>$message = 無効なファイルが指定されました。;<br/><br/> 列挙我们上传的文件:<br/><br/>$handle=opendir($upload_dir);<br/>$filelist = ;<br/>while ($file = readdir($handle)) {<br/> if(!is_dir($file) && !is_link($file)) {<br/> $filelist .= <a href='$upload_dir$file'>.$file.</a>;<br/> if ($DELETABLE)<br/> $filelist .= <a href='?del=$upload_dir$file' title='delete'>x</a>;<br/> $filelist .= <sub><small><small><font color=grey> .date( d-m H:i, filemtime($upload_dir.$file))<br/>.;<br/> $filelist .=<br>;<br/> } <br/>}<br/><br/>function do_upload($upload_dir, $upload_url) {<br/><br/> $temp_name = $_FILES['userfile']['tmp_name'];<br/> $file_name = $_FILES ['ユーザーファイル']['名前']; <br/> $file_name = str_replace(\\,,$file_name);<br/> $file_name = str_replace(',,$file_name);<br/> $file_path = $upload_dir.$file_name;<br/><br/> / /ファイル名チェック<br/> if ( $file_name ==) { <br/> $message = 無効なファイル名が指定されました;<br/> return $message;<br/> }<br/><br/> $result = move_uploaded_file($temp_name , $file_path);<br/> if (!chmod($file_path,0777))<br/> $message = 777 へのアクセス許可の変更に失敗しました。;<br/> else<br/> $message = ($result)?$file_name がアップロードされました成功しました。 :<br/> ファイルのアップロードに問題があります。;<br/> return $message;<br/>}<br/><br/>?><br/><br/><center><br/><font color=red> <?=$_REQUEST[message]?></font><br/><br><br/><form name=upload id=upload ENCTYPE=multipart/form-data method=post><br/>ファイルのアップロード<入力タイプ=file id=userfile name=userfile><br/><input type=submit name=upload value=Upload><br/></form><br/><br/><br><b>マイファイル<br/><hr width=70%><br/><?=$filelist?><br/><hr width=70%><br/><small><sup>開発者 <br/><a style=text-decoration :none href=http://tech.citypost.ca>CityPost.ca</a><br/></sup></small><br/></center></script>



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。