`
happinessmoon
  • 浏览: 75711 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

预览待上传的本地图片

阅读更多

上传文件是一种很普通的Web应用,尤其以上传图片更为常见。今天我们就在Web标准的范围内谈谈与这个主题相关的内容(只限前端部分,上传的实现当然就不在此列了),关键词是:Javascript、DOM和Firefox。

表单

  先创建一个file表单域,我们需要用它来浏览本地文件。

<form name="form1" id="form1" method="post" action="upload.php">
 <input type="file" name="file1" id="file1" />
</form>

 

 

  试下效果:

<form id="form1" action="#" accept-charset="UNKNOWN" enctype="multipart/form-data" method="post">   <input id="filed1" maxlength="2147483647" name="file1" size="20" type="file"> </form>

 

判断文件类型

  当用户选择了一个图片文件时,我们希望他能马上看到这张图片的缩略图,以便他能确认没有把自己的光屁股照片当作头像传到我们的服务器上^_^。

  在预览之前我们还得先判断一下用户选择的是不是一个图像文件,如果他想用一个.rar文件做头像的话我们也需要礼貌地提醒一下。

<form name="form2" id="form2" method="post" action="upload.php">
 <input type="file" name="file2" id="file2"
 onchange="preview()" />
</form>
 

  Javascript函数实现,注意我们使用DOM方法getElementById来访问对象。不要再使用form

和input的name属性来访问对象了,只有IE才这么干。

 

<script type="text/javascript">
 function preview2(){
  var x = document.getElementById("file2");
  if(!x || !x.value) return;
  if(x.value.indexOf(".jpg")<0
   && x.value.indexOf(".jpeg")<0
   && x.value.indexOf(".gif")<0){
   alert("您选择的似乎不是图像文件。");
  }else{
   alert("通过");
  }
 }
</script>
 

  试下效果(这里无法显示,可粘贴到你的程序中):

 

<form id="form2" action="#" accept-charset="UNKNOWN" enctype="multipart/form-data" method="post">   <input id="file2" maxlength="2147483647" name="file2" size="20" type="file"> </form> 

<noscript type="text/javascript"></noscript> 

 

 

  这里有一个问题,如果用户选择了名为“fake.jpg.txt”的文件,这段脚本仍旧会认为这是一个合法的图像文件。一个可行的解决方案是先把文件名转换成小写,再取文件路径的最后4到5位,判断一下文件的扩展名是否确为我们支持的图像文件扩展名。不过这种方案略显笨拙,也没有什么美感可言,我们换一种方案:用“正则表达式”来判断文件扩展名。

<script type="text/javascript"> function preview3(){ var x = document.getElementById("file3"); if(!x || !x.value) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ alert("通过"); }else{ alert("您选择的似乎不是图像文件。"); } } </script>

  看看效果(可以自己创建一个“fake.jpg.txt”文件试试):

<form id="form3" action="#" accept-charset="UNKNOWN" enctype="multipart/form-data" method="post">   <input id="file3" maxlength="2147483647" name="file3" size="20" type="file"> </form>

<noscript type="text/javascript"></noscript>

  如果从来没有接触过正则表达式,那这段脚本对你可能会有些晦涩,不妨Google一把,看看是否可以先学习学习这方面的知识。我可以向你保证花四五个小时学点正则表达式会是你最近三个月内作出的最明智选择^_^。

  回到这段脚本上来,即使你还看不懂正则表达式那两行,但整段脚本的美感还是很明显的:简洁、直接、语义流畅,这与Web标准关于XHTML的要求是一致的,与Web设计师或开发者天生的“完美”主义也是一致的。

  jjww一大段之后,我们转入重点——

预览图片

  预览功能的基本设计思路是很清晰的:创建一个img元素,再把文件域的value值赋值给img

元素的src属性。

 

<form name="form4" id="form4" method="post" action="#"> <input type="file" name="file4" id="file4" onchange="preview4()" /> <img id="pic4" src="" alt="图片在此显示" width="120"/> </form> <script type="text/javascript"> function preview4(){ var x = document.getElementById("file4"); var y = document.getElementById("pic4"); if(!x || !x.value || !y) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ y.src = "file://localhost/" + x.value; }else{ alert("您选择的似乎不是图像文件。"); } } </script>

  试下效果:

 

<form id="form4" action="#" accept-charset="UNKNOWN" enctype="multipart/form-data" method="post">   <input id="file4" maxlength="2147483647" name="file4" size="20" type="file"> 图片在此显示 </form>

<noscript type="text/javascript"></noscript>

 

  如果你用的是Firefox(或Opera),可能会发现什么也没有发生。是的,很不幸Firefox的安全策略不允许我们显示一个用户的本地图像文件。不知道他们为什么要这么做,我个人觉得图像文件并不会造成严重的安全性问题。即使是不久前比较热门的那个会引起Windows崩溃的jpeg文件,要显示它的前提条件是用户自己选择了这个文件或者你知道这个文件在用户硬盘上的准确路径。所以我想这种策略很可能来自于一个“懒惰”的开发人员,他并不想多写一些程序来区分这个本地文件是一个图像文件还是一个恶意文件,Firefox对安全性的要求让他们有些过于敏感了。

  让Firefox显示本地文件的唯一办法就是修改它的默认安全策略:

  1. 在Firefox的地址栏中输入“about:config
  2. 继续输入“security.checkloaduri
  3. 双击下面列出来的一行文字,把它的值由true改为false

  然后你可以再试试上面预览,everything works well!可惜的是我们并不能要求所有的用户都去修改这个值(更不用说修改的过程还挺麻烦),所以这对我们来说毫无意义。我们能做的也许就是接受Firefox不能预览本地图片这种“可笑”的局面。

用DOM来创建对象

  在上面的XHTML代码中,我们为了预览图片,事先加入了一个没有设置src的img对象。除去不美观、代码冗余之外,如果用户浏览器不支持Javascript,他不仅无法使用这个功能,还要接受页面上一个永远不会显示出来的破图。要解决这个问题,我们就需要在“运行时”再生成这个img对象,途径还是DOM。

 

<form name="form5" id="form5" method="post" action="#"> <input type="file" name="file5" id="file5" onchange="preview5()"/> </form> <script type="text/javascript"> function preview5(){ var x = document.getElementById("file5"); if(!x || !x.value) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ var y = document.getElementById("img5"); if(y){ y.src = 'file://localhost/' + x.value; }else{ var img=document.createElement('img'); img.setAttribute('src','file://localhost/'+x.value); img.setAttribute('width','120'); img.setAttribute('height','90'); img.setAttribute('id','img5'); document.getElementById('form5').appendChild(img); } }else{ alert("您选择的似乎不是图像文件。"); } } </script>

  试下效果:

 

<form id="form5" action="#" accept-charset="UNKNOWN" enctype="multipart/form-data" method="post">   <input id="file5" maxlength="2147483647" name="file5" size="20" type="file"> </form>

<noscript type="text/javascript"></noscript>

 

  这样就相对比较完美了。我也不解释上面这些DOM方法的具体意义,Google一下什么都有了。DOM和正则表达式一样,都是“包你不悔”的实用技术,如果你希望更多了解、深入学习、或者顺利实践Web标准,DOM是不可或缺的。从我本人最近的体会来说,Javascript+DOM+CSS蕴藏着强大的能量,就看你怎么释放它了。

分享到:
评论

相关推荐

    用js实现预览待上传的本地图片

    ### 使用JavaScript预览待上传的本地图片 在Web开发中,允许用户实时预览即将上传的图片是一项非常实用的功能。这不仅可以提升用户体验,还可以帮助用户确保上传正确的文件类型。本文将详细解析如何利用JavaScript...

    图片选择+多图上传

    - **文件队列**:为了实现多图上传,通常需要维护一个文件队列,将待上传的图片按顺序放入队列,并使用线程池控制并发上传的数量,避免服务器压力过大。 - **进度反馈**:在上传过程中,可以监听上传进度,更新UI...

    flash超级棒的上传图片

    用户可以在编辑界面内直接选择本地图片,预览、翻转、裁剪,甚至批量上传,极大地提升了用户体验。 然而,随着HTML5的普及和Adobe公司宣布停止对Flash的支持,越来越多的现代浏览器不再内置Flash Player,转向了...

    jqurey截图上传图片

    待裁剪的图片"&gt; 裁剪并上传 ``` 接下来,编写JavaScript代码来初始化插件,设置裁切参数,并在用户点击"裁剪并上传"按钮时执行裁切和上传操作: ```javascript $(document).ready(function() { var $image = $...

    xftp用于连接xshel上传本地文件到虚拟机中

    【标题】:“xftp用于连接xshel上传本地文件到虚拟机中” 【正文】: 在IT行业中,尤其是在系统管理、开发与测试等工作中,经常需要在本地计算机和远程服务器之间传输文件。XFTP(eXtreme File Transfer Protocol...

    Pictureuploader一个基于vue2x的HTML5上传图片组件

    - **FormData 对象**:用于存储键值对,常用于封装待上传的文件信息,方便通过Ajax发送到服务器。 - **XMLHttpRequest 或者 fetch API**:用于异步发送HTTP请求,实现文件的上传。 - **Promise 和 async/await**:...

    图片上传工具

    在IT领域,图片上传工具是常见的一种应用,主要用于帮助用户便捷地将本地的图片资源上传到网络服务器或者特定的应用程序中。这样的工具通常包含了多种功能,以满足不同用户的需求。根据提供的标题“图片上传工具”和...

    前端组件 plupload 文件上传demo

    3. **本地预览**:用户可以预览上传的文件,尤其是图片,提供更好的交互体验。 4. **拖拽上传**:在支持 HTML5 的浏览器中,`plupload` 支持拖放操作,用户可以直接从桌面拖动文件到指定区域进行上传。 5. **文件...

    onethink 头像剪切上传

    1. 图像选择与预览:前端通常使用HTML5的File API来实现用户选择本地图片并进行预览。通过`&lt;input type="file"&gt;`元素让用户选择文件,然后利用FileReader对象的readAsDataURL方法将选取的图片转换为base64编码的URL...

    【JavaScript源代码】js实现头像上传并且可预览提交.docx

    本文介绍的方法是通过在本地内存中预览所选图片,待用户确认后才将其上传到服务器保存。这种方法相对于直接上传到服务器的临时文件夹再进行预览的方式,在一定程度上减少了服务器的压力以及网络流量消耗,但同时也...

    bootstrap+cropper图片裁剪代码

    在H5(HTML5)应用中,这种功能常常用于头像上传、图片预览和编辑等场景。下面我们将深入探讨这两个库以及如何将它们结合使用来实现图片裁剪功能。 **Bootstrap** Bootstrap 是一个流行的开源 CSS 框架,它提供了一...

    图片上传手机框架.rar_CSharp 界面_手机_手机 框架

    5. **文件管理**:在本地存储和读取图片,以及临时存储待上传的图片,都需要文件系统操作。C#提供了丰富的类库来支持这些操作。 6. **2次开发与修改调用**:此框架允许开发者在其基础上进行定制,添加新的功能或...

    Vue 图片压缩并上传至服务器功能

    在`compressImage`方法中,首先创建一个新的`Image`对象,设置其`src`为待压缩图片的路径,然后监听`onload`事件。当图片加载完成后,根据原始图片的宽高和最大宽高限制计算压缩比例。接着创建一个`canvas`元素,...

    无刷新预览

    1. 创建文件输入元素:首先在HTML中创建一个文件选择输入框,用户可以通过这个元素选择待上传的图片。 ```html *"&gt; ``` 2. 监听文件改变事件:使用JavaScript监听`change`事件,当用户选择文件后触发。 ```...

    uploadfy实现无刷新上传,下载即可直接运行

    1. **选择文件**:用户通过点击按钮或拖放操作选择待上传的文件。UploadFY会监听这些事件,并利用File API获取选定文件的信息。 2. **预览和验证**:在上传前,UploadFY可以提供文件预览功能,同时对文件类型、大小...

    photo.rar文件上传

    1. **文件上传接口设计**:在前端,我们需要一个用户界面来选择并提交待上传的文件。这通常通过HTML的`&lt;input type="file"&gt;`元素实现,允许用户选择本地文件。配合JavaScript,可以监听文件选择事件,读取文件内容...

    js脚本--图片的转换功能

    通过熟练掌握这些知识,你可以构建出各种丰富的图像处理功能,如图片上传、预览、裁剪、压缩等,提升用户的交互体验。在实际应用中,还应注意兼容性问题,确保在不同的浏览器和设备上都能正常工作。

    javascript图片特效

    9. 图片拖放:HTML5的拖放API允许用户通过JavaScript实现图片的拖放功能,用户可以将本地图片直接拖放到网页上,实现上传或预览。 10. 图片分页加载:对于拥有大量图片的画廊或相册,JavaScript可以实现分页加载,...

    微信小程序图片剪切Demo

    6. **接口调用**:完成剪切后,可能需要将裁剪后的图片保存到本地或者上传服务器。可以使用`wx.saveImageToPhotosAlbum`保存到手机相册,或者`wx.uploadFile`将图片上传到服务器。 7. **事件处理**:微信小程序中的...

Global site tag (gtag.js) - Google Analytics