JavaScript图片上传前预览和限制图片格式

80酷酷网    80kuku.com

  javascript|上传

这是一则PHP图片上传的例子,这里想说明的是在上传图片前,当用户从本地或是远程选择图片时能够预览图片,由于上传的图片有大有小,宽窄不一,上传后我们都将对图片进行裁减处理,但是在上传前用户能否知道裁减后的效果呢?而且能否在提交前就告诉用户哪些图片格式是有效的呢?答案是肯定的,本例就是一个上载图片前预览图片,并按比例压缩的实际例子,代码很简单,主要是创建一个new Image(),然后给这个给这个image写入要显示的地方,而图片格式是否有效,是通过文件上的后缀来判断的,js里没有直接验证文件的格式的函数,需要通过substring()文件名最后一个.来判断。

本例效果虽然能实现,但在预览时仍有两个问题要注意
1,在Opera下,由于得不到上传框里的本地图片全部路径(只能得到文件名),所以无法预览图片。
2,用Firefox远程访问本文件时,出于安全原因,ff不允许预览本地的图片,在本地则可以。
注:这些在IE下均没有这些问题。
以下是本例的全部代码:
<html>
<head>
<title>上载文件表单</title></head>
<style>
#con { background-color:#c1c1c1}
#t{width:100px;float:left;clear:both;}
#con li{display:inline;}
#perDiv{position:absolute;width:210px;left:420px;height:210px;background-color:;align:center}
</style>
<body>
upload example for php by jarry!
<form enctype="multipart/form-data" action="upload.php" name="uploadform" method="post">

<div id="perDiv" face=Verdana><div id="con">
<div id=t>请选择文件:</div>
<li><input name="upload_file" type="file" size="30" >(将远程图片的url粘贴进来也可以)</li>

<font size=-1>只接受后缀名为".gif",".jpg",".jpeg","png","bmp"的文件! </font>

<div id=t>名称:</div>

<li><input type=text value="11" size="30" name="name"></li>

<div id=t>描述:</div>
<li><textarea rows="5" cols="30" name="description">11</textarea></li>

<div id=t>上传人:</div>
<li><input type="text" value="11" size="40" name="uploader"></li>

<div id=t> </div><input type="submit" value="上传文件">  <a href="showimg.php">查看图片</a>

</div>
<div id="divinfo">
</div>
</form>
<br clear="both">
<b><a href="showimg.php">查看上传图片列表</a></b>

<script type="text/javascript">

function selectFile(obj1,obj2){
    var filepath = obj1.value;
    if(filepath.lastIndexOf("\\")>0){
         filename= filepath.substring(filepath.lastIndexOf("\\")+1,filepath.length);
    }
    obj2.value = filename;//用来得到文件名;
}
var re;
var tempimg=new Image();//构建一个image对象,用来临时存取上传的图片信息
function perImg(o)
{//o是浏览上传的值;

isOpare=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1)?true:false;
if(isOpare && o.indexOf("http://")==-1){document.getElementById("perDiv").innerHTML="Opera 浏览器得到不本地路径,所以无法提供预览效果,谢谢!";return;}

    //tempimg.src="http://www.pushad.com/XrssFile/2007-2/6/20072612928765.gif";
    //tempimg.src=o;//return;
    //远程访问时浏览本地的图片时因为安全原因而在firefox下能预览,
    //ie下都没有问题:(,打开静态页面时也没有问题;
    //可以把在线的图片url拷贝至文件框试一试,拷贝进来的一律有效,(地址为http://的)在其它浏览器下均有效
    //而如果是firefox如果是通过远程访问,选择图片时无法预览本地的图片
    //这可以说是firefox为安全考虑的一个方面,也可以说是firefox下的bug
    //而对于opera来讲,只要是从本地选择的图片(不管是本地还是远程访问本文件),都得不到全部的路径,所以opera下是无法预览本地图片的
    //如果是远程的图片地址,粘贴进文件框里(地址为http://的),就都可以预览图片了。
   
 if(o!=""){
 // o=encodeURIComponent(o);
   if(o.indexOf("file:///")==-1 && o.indexOf("http://")==-1)o="file:///"+o;
   //给url加上file,这种方式在非windows平台可能会有问题;
   o=o.replace(/\\/g,"/");
   tempimg.src=o;
   //alert(o+"||"+tempimg.width+"||"+tempimg.height);
   clearTimeout(re);
   re=setTimeout("resize(tempimg)",100);
   //设置100毫秒的迟延就可解决ff下得到前一次size的问题;
 }
}

function resize(o){
//预览时若图片宽或高大于200*200,则设定宽或高最大为200*200;
//上传后再用java/php/c等裁剪生成大小两张图片;
  ow=o.width;
  oh=o.height;
  var ow2=ow,oh2=oh;//得到宽高
  //alert("ow:"+ow+"oh:"+oh+"\now2:"+ow2+"oh2"+oh2)
  try{
  if(ow>oh){//如宽大于高且宽大于200就缩小宽为200,高则按比例缩放
      if(ow>200){ow2=200;oh2="auto";}
  }else{//如高大于宽且高大于200就缩小高为200,宽则按比例缩放
      if(oh>200){oh2=200;ow2="auto";}
  }
          var showdiv=document.getElementById("divinfo");
          var info="原宽:"+ow+" || 原高:"+oh+" == "+"改后宽:"+ow2+" || 改后高:"+oh2;
          var getimg="<a href=\""+o.src+"\" onclick=\"window.open(this.href,'','width=500,height=400,top='+(window.screen.height-500)/2+',left='+(window.screen.width-500)/2+',resizable=yes ');return false;\" target=\"_blank\">"
                                +"<img border=\"0\" id=\"uploadimg\" src=\""+o.src+"\" +"</a>";
          document.getElementById("perDiv").innerHTML=getimg;
          if(showdiv)showdiv.innerHTML=info;          
  }catch(ex){
     alert(ex.toString());
  } 

}
//jiarry.126.com
//differentiate file type

var right_type=new Array(".gif",".jpg",".jpeg","png","bmp")
function checkImgType(fileURL)
{
//本程序用来验证后缀,如果还有其它格式,可以添加在right_type;
var right_typeLen=right_type.length;
var imgUrl=fileURL.toLowerCase();
var postfixLen=imgUrl.length;
var len4=imgUrl.substring(postfixLen-4,postfixLen);
var len5=imgUrl.substring(postfixLen-5,postfixLen);
for (i=0;i<right_typeLen;i++)
{
    if((len4==right_type[i])||(len5==right_type[i]))
    {
    return true;
    }
 }
}


var xlist=0;var errStr="";
function sub(o){
   if(o.upload_file.value==""){xlist+=1;errStr+=xlist+")请选择一个图片文件\n";}
   if(o.name.value==""){xlist+=1;errStr+=xlist+")请输入名称\n";}
   if(o.description.value==""){ xlist+=1; errStr+=xlist+")请输入描述\n";}
   if(o.uploader.value==""){xlist+=1; errStr+=xlist+")请输入上传人\n";}  
   if(errStr!=""){
       alert(errStr);
       xlist=0;errStr="";
       return false;
   }
   if(checkImgType(o.upload_file.value)){
    perImg(o.upload_file.value);
    return true;
     //alert("选择图片正确,你上传的图片是"+o.upload_file.value);
     return false;
   }else{
   alert("您选择的文件格式不正确!");o.upload_file.focus();
   return false;
   }
}

</script>
</body>
</html>
<?
/*data*/
$conn=mysql_connect("localhost","root","")or die("连接失败!");
mysql_select_db("test",$conn);
/*data*/
$upload_file=$_FILES['upload_file']['tmp_name'];
$upload_file_name=$_FILES['upload_file']['name'];
if($upload_file){
$file_size_max = 1000*1000;// 1M限制文件上传最大容量(bytes)
$store_dir = "upimg/";// 上传文件的储存位置
$accept_overwrite = 1;//是否允许覆盖相同文件
// 检查文件大小
if ($upload_file_size > $file_size_max) {
echo "对不起,你的文件容量大于规定";
exit;
}

// 检查读写文件
if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {
Echo "存在相同文件名的文件";
exit;
}

//复制文件到指定目录
if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {
echo "复制文件失败";
exit;
}

}

echo "<p>你上传了文件:";
echo $_FILES['upload_file']['name'];
echo "
";
//客户端机器文件的原名称。

Echo "文件的 MIME 类型为:";
echo $_FILES['upload_file']['type'];
//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
echo "
";

Echo "上传文件大小:";
echo $_FILES['upload_file']['size'];
//已上传文件的大小,单位为字节。
echo "
";

Echo "文件上传后被临时储存为:";
echo $_FILES['upload_file']['tmp_name'];
//文件被上传后在服务端储存的临时文件名。
echo "
";
$name=$_FILES['upload_file']['name'];
$path=$_FILES['upload_file']['name'];
$type=$_FILES['upload_file']['type'];
$size=$_FILES['upload_file']['size'];
$desc=$_POST['description'];
$note=$_POST['uploader'];
$name=$_POST['name'];
/*insert database*/
if(!empty($name)){
$inserSql = mysql_query("insert into upimg (name,path,type,size,description,note) " .
        "values ('$name','$path','$type','$size','$desc','$note')");
//echo "a".$_POST['upload_file']."a";
}else{
//echo "b".$_POST['upload_file']."b";
}

$Erroe=$_FILES['upload_file']['error'];
echo "<font color=red>";
switch($Erroe){
case 0:
Echo "上传成功";
break;
case 1:
Echo "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break;
case 2:
Echo "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"; break;
case 3:
Echo "文件只有部分被上传";break;
case 4:
Echo "没有文件被上传";break;
}
echo "</font>";
mysql_close($conn) or die("无法与服务器断开连接!");
?>
本例下载地址(如果本地址非个人主机,不保证每次都能打开或长期有效)
http://lslnx.zsu.edu.cn/webspace/78229/personel_web/jiarry/resources/previewImg.html

 



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: