程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 上傳頭像,界面無跳轉,php+js

上傳頭像,界面無跳轉,php+js

編輯:關於PHP編程

上傳頭像,界面無跳轉的方式很多,我用的是加個iframe那種。下面直接上代碼。

html:

//route 為後端接口
//upload/avatar 為上傳的頭像的保存地址
//imgurl=/upload/avatar/<?=$uid?> 這裡最後的<?=$uid?>是為了後面用js實現即時顯示最新的更換後的頭像用的,參照下面的js部分的代碼
//頭像保存名稱為uid.type,如1.jpg,2.png等
//$user['avatar'] 用戶如果上傳過頭像,該用戶數據庫中的avatar字段將賦予時間戳,否則為空
<form target="iframe" enctype="multipart/form-data" action="route?imgurl=/upload/avatar/<?=$uid?>" method="post" id="upload_form"> <img class="thumb" src="<?php if($user['avatar']) echo $my_img; else echo '/view/img/100.png'; ?>" $token = param('token'); $user = user_from_token($token); !$user AND exit("<p class='iframe_message' status='0'>$lang[user_not_exists]</p>"); //文件存儲路徑 $file_path="./upload/avatar/"; //664權限為文件屬主和屬組用戶可讀和寫,其他用戶只讀。 if(is_dir($file_path) != TRUE) mkdir($file_path, 0664) ; //定義允許上傳的文件擴展名 $ext_arr = array("gif", "jpg", "jpeg", "png", "bmp");
if (empty($_FILES) === false) {   //判斷檢查   $photo_up_size > 2097152 AND exit("<p class='iframe_message' status='0'>對不起,您上傳的照片超過了2M</p>");   $_FILES["file"]["error"] > 0 AND exit("<p class='iframe_message' status='0'>文件上傳發生錯誤:".$_FILES["file"]["error"]."</p>");   //獲得文件擴展名   $temp_arr = explode(".", $_FILES["file"]["name"]);   $file_ext = array_pop($temp_arr);   $file_ext = trim($file_ext);   $file_ext = strtolower($file_ext);   //檢查擴展名   if (in_array($file_ext, $ext_arr) === false) {     exit("<p class='iframe_message' status='0'>上傳文件擴展名是不允許的擴展名</p>");   }   //刪除目錄下相同前綴的文件   if($dh = opendir($file_path)) {     while(($file = readdir($dh)) !== false) {       $file_arr = $file.split('.');       if($file_arr[0] == $user['uid']) unlink($file_path.$file);     }   }   //以uid重命名文件   $new_name = $user['uid'].".".$file_ext;   //將文件移動到存儲目錄下   move_uploaded_file($_FILES["file"]["tmp_name"], $file_path.$new_name);   //裁剪壓縮圖片   clip($file_path.$new_name, $file_path.$new_name, 0, 0, 100, 100);   clip_thumb($file_path.$new_name, $file_path.$new_name, 100, 100);   //向數據表寫入文件存儲信息以便管理   user_update($user['uid'], array('avatar'=>time()));   exit("<p class='iframe_message' status='1'>文件上傳成功</p>"); } else {   exit("<p class='iframe_message' status='0'>無正確的文件上傳</p>"); }
<?php
	
	function ext($filename) {
		return strtolower(substr(strrchr($filename, '.'), 1));
	}
	
	/* 
		實例:
	 	thumb(APP_PATH.'xxx.jpg', APP_PATH.'xxx_thumb.jpg', 200, 200);
	 	
	 	返回:
	 	array('filesize'=>0, 'width'=>0, 'height'=>0)
	 */
	function thumb($sourcefile, $destfile, $forcedwidth = 80, $forcedheight = 80) {
		$return = array('filesize'=>0, 'width'=>0, 'height'=>0);
		$imgcomp = 10;
		$destext = ext($destfile);
		if(!in_array($destext, array('gif', 'jpg', 'bmp', 'png'))) {
			return $return;
		}
	
		$imgcomp = 100 - $imgcomp;
		$imginfo = getimagesize($sourcefile);
		$src_width = $imginfo[0];
		$src_height = $imginfo[1];
		if($src_width == 0 || $src_height == 0) {
			return $return;
		}
		$src_scale = $src_width / $src_height;
		$des_scale = $forcedwidth / $forcedheight;
		
		if(!function_exists('imagecreatefromjpeg')) {
			copy($sourcefile, $destfile);
			$return = array('filesize'=>filesize($destfile), 'width'=>$src_width, 'height'=>$src_height);
			return $return;
		}
	
		// 按規定比例縮略
		if($src_width <= $forcedwidth && $src_height <= $forcedheight) {
			$des_width = $src_width;
			$des_height = $src_height;
		} elseif($src_scale >= $des_scale) {
			$des_width = ($src_width >= $forcedwidth) ? $forcedwidth : $src_width;
			$des_height = $des_width / $src_scale;
			$des_height = ($des_height >= $forcedheight) ? $forcedheight : $des_height;
		} else {
			$des_height = ($src_height >= $forcedheight) ? $forcedheight : $src_height;
			$des_width = $des_height * $src_scale;
			$des_width = ($des_width >= $forcedwidth) ? $forcedwidth : $des_width;
		}
	
		switch ($imginfo['mime']) {
			case 'image/jpeg':
				$img_src = imagecreatefromjpeg($sourcefile);
				!$img_src && $img_src = imagecreatefromgif($sourcefile);
				break;
			case 'image/gif':
				$img_src = imagecreatefromgif($sourcefile);
				!$img_src && $img_src = imagecreatefromjpeg($sourcefile);
				break;
			case 'image/png':
				$img_src = imagecreatefrompng($sourcefile);
				break;
			case 'image/wbmp':
				$img_src = imagecreatefromwbmp($sourcefile);
				break;
			default :
				return $return;
		}
	
		$img_dst = imagecreatetruecolor($des_width, $des_height);
		$img_color = imagecolorallocate($img_dst, 255, 255, 255);
		imagefill($img_dst, 0, 0 ,$img_color);
		imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $des_width, $des_height, $src_width, $src_height);
		//$tmpfile = $temp_path.md5($destfile);
		$tmpfile = $destfile;
		switch($destext) {
			case 'jpg': imagejpeg($img_dst, $tmpfile, $imgcomp); break;
			case 'gif': imagegif($img_dst, $tmpfile, $imgcomp); break;
			case 'png': imagepng($img_dst, $tmpfile, version_compare(PHP_VERSION, '5.1.2') == 1 ? 7 : 70); break;
		}
		$r = array('filesize'=>filesize($tmpfile), 'width'=>$des_width, 'height'=>$des_height);;
		copy($tmpfile, $destfile);
		//unlink($tmpfile);
		imagedestroy($img_dst);
		return $r;
	}
	/*
	 * 圖片裁切
	 *
	 * @param string $srcname	原圖片路徑(絕對路徑/*.jpg)
	 * @param string $forcedheight 	裁切後生成新名稱(絕對路徑/rename.jpg)
	 * @param int $sourcefile 	被裁切圖片的X坐標
	 * @param int $destfile 	被裁切圖片的Y坐標
	 * @param int $destext 		被裁區域的寬度
	 * @param int $imgcomp 		被裁區域的高度
	   clip('xxx/x.jpg', 'xxx/newx.jpg', 10, 40, 150, 150)
	 */
	function clip($sourcefile, $destfile, $clipx, $clipy, $clipwidth, $clipheight) {
		$getimgsize = getimagesize($sourcefile);
		if(empty($getimgsize)) {
			return 0;
		} else {
			$imgwidth = $getimgsize[0];
			$imgheight = $getimgsize[1];
			if($imgwidth == 0 || $imgheight == 0) {
				return 0;
			}
		}
		
		if(!function_exists('imagecreatefromjpeg')) {
			copy($sourcefile, $destfile);
			return filesize($destfile);
		}
		switch($getimgsize[2]) {
			case 1 :
			$imgcolor = imagecreatefromgif($sourcefile);
			break;
			case 2 :
			$imgcolor = imagecreatefromjpeg($sourcefile);
			break;
			case 3 :
			$imgcolor = imagecreatefrompng($sourcefile);
			break;
		}
		//$imgcolor = imagecreatefromjpeg($sourcefile);
		$img_dst = imagecreatetruecolor($clipwidth, $clipheight);
		$img_color = imagecolorallocate($img_dst, 255, 255, 255);
		imagefill($img_dst, 0, 0, $img_color);
		imagecopyresampled($img_dst, $imgcolor, 0, 0, $clipx, $clipy, $imgwidth, $imgheight, $imgwidth, $imgheight);	
		$tmpfile = $destfile;
		imagejpeg($img_dst, $tmpfile, 100);
		$n = filesize($tmpfile);
		copy($tmpfile, $destfile);
		return $n;
	}
	
	// 先裁切後縮略,因為確定了,width, height, 不需要返回寬高。
	function clip_thumb($sourcefile, $destfile, $forcedwidth = 80, $forcedheight = 80) {
		// 獲取原圖片寬高
		$getimgsize = getimagesize($sourcefile);
		if(empty($getimgsize)) {
			return 0;
		} else {
			$src_width = $getimgsize[0];
			$src_height = $getimgsize[1];
			if($src_width == 0 || $src_height == 0) {
				return 0;
			}
		}
		
		$src_scale = $src_width / $src_height;
		$des_scale = $forcedwidth / $forcedheight;
		
		if($src_width <= $forcedwidth && $src_height <= $forcedheight) {
			$des_width = $src_width;
			$des_height = $src_height;
			$n = clip($sourcefile, $destfile, 0, 0, $des_width, $des_height);
			return filesize($destfile);
		// 原圖為橫著的矩形
		} elseif($src_scale >= $des_scale) {
			// 以原圖的高度作為標准,進行縮略
			$des_height = $src_height;
			$des_width = $src_height / $des_scale;
			$n = clip($sourcefile, $destfile, 0, 0, $des_width, $des_height);
			if($n <= 0) return 0;
			$r = thumb($destfile, $destfile, $forcedwidth, $forcedheight);
			return $r['filesize'];
		// 原圖為豎著的矩形
		} else {
			// 以原圖的寬度作為標准,進行縮略
			$des_width = $src_width;
			$des_height = $src_width / $des_scale;
			$n = clip($sourcefile, $destfile, 0, 0, $des_width, $des_height);
			if($n <= 0) return 0;
			$r = thumb($destfile, $destfile, $forcedwidth, $forcedheight);
			return $r['filesize'];
		}
	}

?>

我們php中設置返回內容,會發現,在出現相應情況後,返回內容出現在頁面的iframe中,所以我們設定了相應的class,以便前端獲得返回內容,做出相應處理。clip(),clip_thumb()為裁剪圖片函數,可壓縮圖片大小,裁取圖片以左上角為起點,長寬為100的正方形。

js:

  var jsubmit_file = jinput.filter('[name="submit_file"]');
  var jfile = jinput.filter('[name="file"]');
  var jiframe = $('#iframe');
  var jthumb = $('.thumb');
  var type = '';  
  jfile.on('change', function() {
        var path = jfile.val();
        var file_arr = path.split('.');
        type = file_arr[file_arr.length-1];
        jsubmit_file.trigger('click');
    });
    jiframe.on('load', function() {
        var jiframe_message = $(window.frames['iframe'].document).find('.iframe_message');
        if(jiframe_message.attr('status') != 0) {
            var url = this.contentWindow.location.href;
            var url_arr = url.split('=');
            jthumb.attr('src', url_arr[1] + '.' + type);
        }
        alert(jiframe_message.text());
    });

這樣基本就實現了圖片上傳、上傳結果提示、即時顯示上傳的最新頭像這幾個功能,網上有各種插件,雖然功能豐富,就是體積太大,這個看我們取捨了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved