h5实现本地图片或文件的上传

首先放一个今天学到的小demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .myImg {
            width: 200px;
        }

        #imgs {
            width: 500px;
            height: 500px;
            background-color: cornsilk;
            margin: 50px auto;
        }
    </style>
</head>
<body>

<div id="imgs" ondragover="allowDrop(event)" ondrop="dropImg(event)">

</div>

<script>
    //禁用掉浏览器掉默认行为
    function allowDrop(e) {
        e.preventDefault();
    }
    //当拖放结束时调用:
    function dropImg(e) {
        //禁用掉浏览器掉默认行为
        e.preventDefault();
        //data为获取到的文件,只能在ondrop中得到
        var data = e.dataTransfer.files;
        //获取多个文件时,遍历文件,判断文件是否为我们所要求的类型,并做出处理
        for (var i = 0; i < data.length; i++) {
            //判断文件类型,indexOf()的结果假为-1,真为0
            var myType = data[i].type;
            console.log(myType.indexOf(‘image‘));
            if (myType.indexOf(‘image‘) === 0) {
                //FileReader为html5中封装的方法,用于将文件读入内存,并读取文件中的数据
                var reader = new FileReader();
                //读取拖入文件的DataURL,无返回值。
                reader.readAsDataURL(data[i]);
                //读取文件成功时触发
                reader.onload = function () {
                    //this.result为当前文件的base64解码
                    //console.log(this.result);
                    //创建一个img节点并添加到当前框内
                    var img = document.createElement("img");
                    img.src = this.result;
                    img.className = "myImg";
                    document.getElementById("imgs").appendChild(img);
                };
                //无论是否成功读取时都会触发,用来弹出错误或上传数据
                reader.onloadend = function () {
                    //如果上传出错
                    if (reader.error) {
                        alert(reader.error);
                    } else {
                        //可以进行与服务器的上传交互
                    }
                }
            } else {
                //如果传入的非图片格式
                alert("请上传图片!");
            }

        }
        console.log(data);
    }
</script>
</body>
</html>

  效果大家可以试一下,每一步的注释也有写。下面具体说一下:

  因为这里的div相当于一个被拖入对象,我们想要实现的效果是图片拖入时把图片呈现出来。而浏览器在解读到图片放入时默认行为是解析图片并显示。这显然不会是我们想要的效果。所以需要禁用掉浏览器对当前事件的默认行为也就是:preventDefault();

  下面就是编写当图片放入时的函数,这里又一个点。是HTML5中的fileAPI,为我们提供了很大的便利。

  根据我们打印出来的结果:

  我们可以看到,根据dataTransfe.filesr我们可以看到所选的文件列表,有兴趣的同学可以具体百度,我这里就不详细介绍了。

HTML5还提供了FileReader接口:用于将文件读入内存,并读取文件中的数据。

  var reader = new FileReader();

  

该接口总共有四个方法和六个事件:
 ?readAsBinaryString(file):读取文件为二进制
 ?readAsDataURL(file):读取文件DataURL
 ?readAsText(file,[encoding]):读取文件为文本
 ?about(none):中断文件读取 
===================================================
 ?onabort:读取文件中断时触发
 ?onerror:读取文件出错时触发
 ?onloadstart:读取文件开始时触发
 ?onprogress:读取文件中时一直触发
 ?onload:读取文件成功时触发
 ?onloadend:读取文件结束时触发(成功和失败都会触发)
以上事件参数e有e.target.result或this.result指向读取的结果。

拖放API:  

拖放属性:将需要拖放的元素的dragable属性设置为true(dragable=”true”)【img元素和a元素默认可以拖放。】

拖放事件:(分为拖放元素事件和目标元素事件)

拖放元素事件:
 ?dragstart:拖拽前触发 
 ?drag ,拖拽前、拖拽结束之间,连续触发
 ?dragend , 拖拽结束触发 
目标元素事件:
 ?dragenter , 进入目标元素触发
 ?dragover ,进入目标、离开目标之间,连续触发
 ?dragleave , 离开目标元素触发
 ?drop , 在目标元素上释放鼠标触发 
但是,需要注意的是:在目标元素中dragover和drop事件中要阻止默认行为(拒绝被拖放),否则拖放不能被实现!

=======================================================================================

DataTransfer对象:专门用于存放拖放时要携带的数据,可以被设置为拖放事件的dataTransfer属性。

三个属性:

?effectAllowed : 设置光标样式(none, copy, copyLink, copyMove, link, linkMove, move, all 和 uninitialized)
 ?effectAllowed:设置拖放操作的视觉效果
 ?types:存入数据的种类,字符串的伪数组
 ?files:获取外部拖拽的文件,返回一个fileList列表,filesList下有个type属性,返回文件的类型

4个方法:

?setData() : 设置数据 key和value(必须是字符串)
 ?getData() : 获取数据,根据key值,获取对应的value
 ?clearData():清除DataTransfer对象存放的数据
 ?setDragImage(imageUrl,log x,long y):用img元素来设置拖放图标

    var dt=e.dataTransfer;//作为拖放事件的dataTransfer属性
    dt.effectAllowed=‘copy‘;//设置光标样式
    dt.setData(‘text/plain‘,‘hello‘);//设置拖放文字
    dt.setDragImage(dragIcom,-10,-10);//设置拖放图标
时间: 2024-12-16 19:31:34

h5实现本地图片或文件的上传的相关文章

图片等文件的上传

先有一个示例: import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; import java.util.Map; import java.util.UUID; import android.util.Log; public class UploadUtil { privat

jQuery+php实现ajax文件即时上传

很多项目中需要用到即时上传功能,比如,选择本地图片后,立即上传并显示图像.本文结合实例讲解如何使用jQuery和PHP实现Ajax即时上传文件的功能,用户只需选择本地图片确定后即实现上传,并显示上传进度条,上传完成后,显示图片信息. 查看演示DEMO下载源码 HTML 本示例基于jQuery以及相当出色的jquery.form插件,所以,先要载入jquery库和form插件.  <script type="text/javascript" src="jquery.min

使用HttpClient实现文件的上传下载

1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 一般的情况下我们都是使用Chrome或者

HttpClient实现文件的上传下载

1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 一般的情况下我们都是使用Chrome或者

利用webuploader实现超大文件分片上传、断点续传

之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需求,都能得到满足.小小开心了一把. 但无论插件再怎么灵活,也难以应付所有的需求,比如,你要上传一个2G的文件.以现在我们的网速,恐怕再快也得传半小时.要命的是,如果你在上传到90%的时候不小心关掉了浏览器,或者是手一抖摁了F5,完了,一切还得从头再来.这种用户体验简直太糟糕了.所以,断点续传就十分有

HTML5实现图片文件异步上传

利用HTML5的新特点做文件异步上传非常简单方便,本文主要展示JS部分,html结构.下面的代码并未使用第三发库,如果有参照,请注意一些未展现出来的代码片段.我这边的效果预览: 1.文件未选择 2.文件已选择 HTML代码部分: 思路:下面代码中我利用css的z-index属性将input="file"标签隐藏在了id=btnSelect元素下面,通过触发a标签的点击后,弹出文件选择框.下面的masklayer用于点击确认按钮后的弹出层,避免用户重复点击确认按钮. <div id

ssh整合问题总结--在添加商品模块实现图片(文件)的上传

今天在做毕设(基于SSH的网上商城项目)中碰到了一个文件上传的需求,就是在后台管理员的商品模块中,有一个添加商品,需要将磁盘上的图片上传到tomcat保存图片的指定目录中: 完成这个功能需要两个步,第一是图片上传,第二是保存到数据库,在完成这个功能时候碰到了一些小问题,所以把完整的步骤记录一下: 第一步,在form标签下,添加一个属性,enctype="multipart/form-data",  我刚开始脑袋短路将这个属性写到了type为file的那么input标签下,结果死活提交不

JS预览图像将本地图片显示到浏览器上

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript"> /** * 从

转:Servlet+Jsp实现图片或文件的上传功能具体思路及代码

首先,我们创建一个新的web工程,在工程的WebRoot目录下新建一个upload文件夹,这样当我们将该工程部署到服务器上时,服务器便也生成个upload文件夹,用来存放上传的资源. 然后,在WebRoot目录下新建一个jsp文件,主要实现的作用就是选择上传的文件,提交至servlet来进行处理 详细代码如下:一个form将文件信息通过post方式传送到指定的servlet <%@ page language="java" import="java.util.*&quo