文件上传之图片预览

一、业界现状分析

有时候我们需要在上传图片之前为用户提供图片预览的功能,HTML5规范出来之前,由于缺少原生的File API支持,我们需要借助Flash或者浏览器插件来满足这种需求。有了HTML5,我们可使用URL或者FileReader对象实现预览功能。

二、应用场景

图片分享类的应用,如Flickr,Facebook。相册应用,如:QQ相册。

虽然139邮箱没有合适的应用场景,但是可将技术预研的成果作为技术储备,好东西总有用得着的时候。

三、编码实现

方式一:window.URL

(1)、先看一下效果图:

(2)、HTML如下:

<input type="file" id="fileElem" multiple accept="image/*" style="display:none" onchange="handleFiles(this.files);this.value=‘‘;">
<a href="#" id="fileSelect">Select some files</a>
<div id="fileList">
  <p>No files selected!</p>
</div

(3)、JS代码如下:

     window.URL = window.URL || window.webkitURL;

        var fileSelect = document.getElementById("fileSelect"), fileElem = document.getElementById("fileElem"), fileList = document.getElementById("fileList");

        fileSelect.addEventListener("click", function(e) {
            if (fileElem) {

             // 单击fileSelect调用input type=‘file‘的单击事件就能弹出文件选择框,是不是很爽?
             // 低版本浏览器必须单击input type=‘file‘才能弹出文件选择框,我在文件上传之普通上传的博文中介绍过解决方案
                fileElem.click();
            }

            // 我们的A标签的href属性值为"#",需要阻止浏览器的默认行为
            e.preventDefault();
        }, false);

        function handleFiles(files) {
            if (!files.length) {
                fileList.innerHTML = "<p>No files selected!</p>";
            } else {
                var list = document.createElement("ul");
                for (var i = 0; i < files.length; i++) {
                    var li = document.createElement("li");
                    list.appendChild(li);

                    var img = document.createElement("img");

                    // 生成文件标示符,并将标示符指向img的src属性
                    img.src = window.URL.createObjectURL(files[i]);
                    img.height = 200;
                    img.onload = function(e) {

                      // 释放文件标示符占用的内存
                        window.URL.revokeObjectURL(this.src);
                    }
                    li.appendChild(img);

                    var info = document.createElement("span");
                    info.innerHTML = files[i].name + ": " + files[i].size + " bytes" + ": " + files[i].type;
                    li.appendChild(info);
                }
                fileList.appendChild(list);
            }
        }

(4)、方法说明:

createObjectURL

每次调用该方法都会为文件生成标识文件的唯一字符串,多次调用该方法即使参数是同一个文件也会生成不同的字符串。因此,我们需要释放文件标识所占用的内存,当页面被销毁时会自动释放,但是如果页面是动态生成的,我们通常会用脚本移除掉包含预览图的DOM,在移除的时候我们需要手动释放内存。但是官方推荐的做法是为图片绑定onload事件,在图片加载完成后释放内存。

revokeObjectURL

释放文件标示符占用的内存,通常在图片的onload事件处理程序中调用该方法

(5)、最后看一下DOM结构,img标签的src属性指向的是一个以blob开头的字符串

方式二: FileReader

(1)、先看一下效果图:

(2)、HTML代码如下:

<input type="file" id="fileElem" multiple accept="image/*" style="display:none" onchange="handleFiles(this.files);this.value=‘‘;">
<a href="#" id="fileSelect">Select some files</a>
<div id="preview"></div>

(3)、JS代码如下:

    function handleFiles(files) {
            var previewEle = document.getElementById("preview");
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                var imageType = /image.*/;

                if (!file.type.match(imageType)) {
                    continue;
                }

                var img = document.createElement("img");
                img.classList.add("obj");
                img.file = file;
                img.width = ‘300‘;

                previewEle.appendChild(img);

                var reader = new FileReader();
                reader.onload = (function(aImg) {
                    return function(e) {
                        aImg.src = e.target.result;
                    };
                })(img);
                reader.readAsDataURL(file);
            }
        }

(4)、看一下DOM结构,img标签的src属性是图片的base64码:

四、参考资料

https://developer.mozilla.org/zh-CN/docs/Using_files_from_web_applications

文件上传之图片预览,布布扣,bubuko.com

时间: 2024-09-30 19:16:37

文件上传之图片预览的相关文章

input实现多文件上传及图片预览

通过使用html的input标签可以实现文件上传比如 <input id="file" type="file" name="upload" multiple onchange="showch();"> 其中将type属性设为file. 添加multiple实现多文件上传入下图所示: 通过使用原生js或jQuery就可以获得文件名,文件路径,文件大小等属性 获得文件属性的js代码如下: <script type

dwz+jquery+fileupload+springmvc实现文件上传 及图片预览

1 前台jsp:文件的上传利用了iframe实现局部刷新功能.使用了apache的fileupload组件,用到的jar: commons-fileupload.jar,commons-io.jarDiskFileItemFactory fac = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(fac);upload.setHeaderEncoding("utf-8"); Html代

2016/4/19 ①单个文件上传 ②上传图片后 预览图片

1,f1.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <!-- 作业:在网上找上传图片预览的代码 上传服务器 再预览--> <form action="f1chuli.php&q

input 文件上传实现本地预览

上传图片 本地预览 获取图片大小 上传视频 本地预览 获取视频 duration 视频大小 图片上传 主要涉及内容 input accept filesList URL.createObjectURL() URL.revokeObjectURL() input file <label for='upload'></label> // ::before :: after 用于扩展可点击区域 <input type="file" id="upload

文件上传(无预览模式版)

文件上传是网页的基本功能之一,这一章我们将讲解无预览模式版本 第一:网页表单显示 <body> <h1>文件上传</h1> <form action="chuli.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <input

文件上传(带有预览模式)

这里所讲的预览是将文件上传至后台之后,代码调用服务器端文件,在网页中显示出来 第一:网页显示部分 和  显示区域css样式表 <body> <h1>文件上传</h1> <form action="chuli.php" method="post" enctype="multipart/form-data" id="sc" target="hidden_frame"&g

11.27 上传下载 图片预览

代码页面 using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls; public partial class Default2 : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { } pr

php文件上传及头像预览

php文件上传原理是通过form表单的enctype="multipart/form-data"属性将文件临时放到wamp文件夹中的tmp目录下,再通过后台php 程序将文件保存在体统中. html代码: 1 <form action="shangchuan.php" method="post" enctype="multipart/form-data"> 2 <input type="file&q

用openoffice+jodconverter+webuploader+pdf.js实现文件上传、在线预览功能

一.背景 最近公司一个项目要实现一个文件上传以及多文档在线预览的功能,之前一直做无线工具开发的,没有涉及到这些东西.另外项目组缺java开发人员,而且自己也只是一个半吊子前端加小半吊子java开发人员,所以让我一个人先弄个Demo出来瞧瞧.在网上搜索了不少资料,在这里只是整理一下,留作以后查阅. 二.插件以及工具包 1.pdfjs-v1.7.225  前端pdf格式文件的显示组件 2.webuploader-0.1.5  百度的文件上传组件 3.video-js-6.2.5 html5视频播放组