文件上传于拖拽

上传文件

目前网页上传分为三种:

1、form提交

2、flash上传

3、插件上传

各有利弊,form提交就是没进度条,不太好取消。flash比较难搞的就是在非ie中浏览器认为flash是新窗口会话,当前网页的cookie无法传递到flash上传工具中,而针对这个一般就是用JS把当前页面中的cookie通过flash再传给后台,而对于一个后台如果使用了统一验证身份的接口那可能会有点麻烦。第三种优势很明显,比如适合如QQ空间这样用户需要大批量上传图片的,缺点也显而易见:跨浏览器上存在问题。而HTML5中的FileReader对象与as3中的很像,只不过目前as3中的方法比这个多(有兴趣可以自己去看看adobe的lives docs,对比一下两者的区别与共同点)。

页面获取多文件***

var result = document.getElementById("result");

var file = document.getElementById("file");

if(typeof FileReader == ‘undefined‘){

result.innerHTML = "<p>抱歉,你的浏览器不支持FileReader</p>";

file.setAttribute("disabled","disabled");

}

function ShowFileName(){

var file = document.getElementById("file");

for(var i =0 ;i<file.files.length;i++){

console.log(file.files[i].name);

}

}

function readAsDataURL(){

var reader = new FileReader();

var file = document.getElementById("file").files[0];

if(!/image\/\w+/.test(file.type)){

alert("请确保文件为图像文件");

return false;

}

reader.onload = function(){

var result = document.getElementById("result");                               result.innerHTML+ = ‘<img  src="‘+this.result+‘" alt =""/>‘;

};

// reader.readAsArrayBuffer(file);

reader.readAsDataURL(file);

}

function readAsDataURL(){

var files = document.getElementById("file").files;

for (var i = files.length - 1; i >= 0; i--) {

var file = files[i];

var reader=new FileReader();

if(!/image\/\w+/.test(file.type)){

alert("请确保文件为图像文件");

return false;

}

reader.onload = function(){

var result = document.getElementById("result");

console.log(result);

result.innerHTML+ = ‘<img  src="‘+this.result+‘" alt =""/>‘;

};

// reader.readAsArrayBuffer(file);

reader.readAsDataURL(file);

}

}

function readAsBinaryString(){

var file = document.getElementById("file").files[0];

var reader = new FileReader();

reader.readAsBinaryString(file);

reader.onload = function(e){

var result = document.getElementById("result");

console.log(result);

result.innerHTML = this.result;

}

}

function readAsText(){

var file = document.getElementById("file").files[0];

var reader = new FileReader();

reader.readAsText(file);

reader.onload = function(e){

var result = document.getElementById("result");

result.innerHTML = this.result;

console.log(result);

}

}

<input type="file" id="file" multiple accept="*.*">

<form action="" method="" enctype="multipart/form-data">

默认情况下,enctype值为enctype=application/x-www-form-urlencoded,这种编码格式不能够上传文件,而采用multipart/form-data时,表单数据被已二进制的方式被传递出去, 无法正常用request接收,所以搞的令人很头疼。。。。

reader.onload = function(){};                     //函数是由reader调用的所以this指向是reader  (注意:此处的FileReader对象读取一个文件内容每读一个文件时new一个此对象)

拖动事件(html5之前只支持文本框和img的拖动)默认图像文本链接可以被拖动 draggable=“true”

dragstart->drag(拖动时持续发生)->[source]dragenter->dragover->dragdrop/dragleave

datatransfer  :是拖动事件的一个属性只能在拖放事件的处理程序中被访问可以 接受text/url 但被映射为“text/plain”|"text/uri-list"用来存放

拖动文本框时浏览器会自动调用setData()将文本以”text“保存,img保存url也可以手动设置

在ondrop事件中中获取,否则之后会被销毁

属性:

dropEffect与effectAllowed   被拖动元素以及作为放置元素可以执行的操作

dropEffect被防止元素可执行的行为:

none不能把文本框防止在这

move应该把拖动元素移动到防止目标

copy把拖动元素复制到防止目标

link拖动元素是一个目标时放置目标会打开拖动元素

effectAllow被拖动元素可执行的行为  :

"uninitialized":未设置任何放置行为

"none"           : 被拖动元素屋任何行为

"copy" 只允许值为“copy”的dropEffect

"link"只允许值为“link”的dropEffect

"move" 只允许值为“copy”的dropEffect

"copyLink"只允许值为“copy”和“link”的dropEffect

"copyMove"  "linkMove"

"all"允许任意dropEffect

addElement(element):为拖动操作增加一个元素          clearData(format)清楚以特定格式保存的数据 setDragImage(element,x,y)指定一幅画在拖动时显示在光标下

eg:

var droptarget = document.getElementById("droptarget"),

dragme = document.getElementById("dragme"),

img = new Image();

img.src = "smile.gif";

function handleEvent(event){

document.getElementById("output").innerHTML += event.type + "<br>";

switch(event.type){

case "dragstart":

event.dataTransfer.setData("Text", "Yippee!");

event.dataTransfer.setDragImage(img, 25, 25);

break;

case "dropenter":

case "dragover":

EventUtil.preventDefault(event);

break;

case "drop":

case "dragdrop":

droptarget.innerHTML = event.dataTransfer.getData("Text");

EventUtil.preventDefault(event);

}

}

EventUtil.addHandler(droptarget, "dragenter", handleEvent);

EventUtil.addHandler(droptarget, "dragover", handleEvent);

EventUtil.addHandler(droptarget, "dragleave", handleEvent);

EventUtil.addHandler(droptarget, "drop", handleEvent);

EventUtil.addHandler(dragme, "dragstart", handleEvent);

文件上传且实现拖动上传

!(function () {

var filesUpload = document.getElementById("files-upload"),

dropArea = document.getElementById("drop-area"),

fileList = document.getElementById("file-list");

function uploadFile (file) {

var li = document.createElement("li"),

div = document.createElement("div"),

img,

progressBarContainer = document.createElement("div"),

progressBar = document.createElement("div"),

reader,

xhr,

fileInfo;

li.appendChild(div);

progressBarContainer.className = "progress-bar-container";

progressBar.className = "progress-bar";

progressBarContainer.appendChild(progressBar);

li.appendChild(progressBarContainer);

/*

If the file is an image and the web browser supports FileReader,

present a preview in the file list

*/

if (typeof FileReader !== "undefined" && (/image/i).test(file.type)) {

img = document.createElement("img");

li.appendChild(img);

reader = new FileReader();

reader.onload = (function (theImg) {

return function (evt) {

theImg.src = evt.target.result;

};

}(img));

reader.readAsDataURL(file);

}

// Uploading - for Firefox, Google Chrome and Safari

xhr = new XMLHttpRequest();

// Update progress bar

xhr.upload.addEventListener("progress", function (evt) {

if (evt.lengthComputable) {

progressBar.style.width = (evt.loaded / evt.total) * 100 + "%";

}

else {

// No data to calculate on

}

}, false);

// File uploaded

xhr.addEventListener("load", function () {

progressBarContainer.className += " uploaded";

progressBar.innerHTML = "Loaded!";

}, false);

xhr.open("post", "upload/upload.php", true);

// Set appropriate headers

xhr.setRequestHeader("Content-Type", "multipart/form-data");

xhr.setRequestHeader("X-File-Name", file.fileName);

xhr.setRequestHeader("X-File-Size", file.fileSize);

xhr.setRequestHeader("X-File-Type", file.type);

xhr.onreadystatechange = function() {

if (xhr.readyState === 4) {

if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {

alert(xhr.responseText);

xhr = null;

}

}

}

// Send the file (doh)

if ("getAsBinary" in file) {

//FF 3.5+

xhr.sendAsBinary(file.getAsBinary());

} else {

xhr.send(file);

}

// Present file info and append it to the list of files

fileInfo = "<div><strong>Name:</strong> " + file.name + "</div>";

fileInfo += "<div><strong>Size:</strong> " + parseInt(file.size / 1024, 10) + " kb</div>";

fileInfo += "<div><strong>Type:</strong> " + file.type + "</div>";

div.innerHTML = fileInfo;

fileList.appendChild(li);

}

function traverseFiles (files) {

if (typeof files !== "undefined") {

for (var i=0, l=files.length; i<l; i++) {

uploadFile(files[i]);

}

}

else {

fileList.innerHTML = "No support for the File API in this web browser";

}

}

filesUpload.addEventListener("change", function () {

traverseFiles(this.files);

}, false);

dropArea.addEventListener("dragleave", function (evt) {

var target = evt.target;

if (target && target === dropArea) {

this.className = "";

}

evt.preventDefault();

evt.stopPropagation();

}, false);

dropArea.addEventListener("dragenter", function (evt) {

this.className = "over";

evt.preventDefault();

evt.stopPropagation();

}, false);

dropArea.addEventListener("dragover", function (evt) {

evt.preventDefault();

evt.stopPropagation();

}, false);

dropArea.addEventListener("drop", function (evt) {

traverseFiles(evt.dataTransfer.files);

this.className = "";

evt.preventDefault();

evt.stopPropagation();

}, false);

})();

时间: 2024-12-11 10:26:42

文件上传于拖拽的相关文章

mvc文件上传支持批量上传,拖拽以及预览,文件内容校验等

使用bootstrap-fileinput 使用方式: 1.nuget:Install-Package bootstrap-fileinput 2.语言本地化{下载fileinput_locale_zh.js}或者修改Fileinput中的本地化词汇 3.文件大小限制:修改fileinput.js中的3195行 maxFilePreviewSize配置节点 示例:前台 @{ Layout = null; } <!DOCTYPE html> <html> <head> &

多文件上传插件Stream,是Uploadify的Flash版和Html5版的结合,带进度条,并支持html5断点续传(附件上传),拖拽等功能

是根据某网的文件上传插件加工而来,支持不同平台(Windows, Linux, Mac, Android, iOS)下,主流浏览器(IE7+, Chrome, Firefox, Safari, 其他)的上传工作,当然在Html5标准下,还支持文件的断点续传功能,有效解决大文件的Web上传问题! 主要特征 1. 支持HTML5.Flash两种方式(跨域)上传 2. 多文件一起上传 3. HTML5支持断点续传,拖拽等新特性 4. 兼容性好IE7+, FF3.6+, Chrome*,Safari4+

7 款基于 JavaScript/AJAX 的文件上传插件

本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 1.  jQuery File Upload 具有多文件上传.拖拽.进度条和图像预览功能的文件上传插件,支持跨域.分块.暂停恢复和客户端图像缩放.可与任何服务端平台(如PHP.Python.Ruby on Rails.Java.Node.js.Go等)一起使用,支持标准的HTML表单文件上传. 2.  Pixelco

7款js文件上传插件

1.  jQuery File Upload 具有多文件上传.拖拽.进度条和图像预览功能的文件上传插件,支持跨域.分块.暂停恢复和客户端图像缩放.可与任何服务端平台(如PHP.Python.Ruby on Rails.Java.Node.js.Go等)一起使用,支持标准的HTML表单文件上传. 2.  Pixelcone Fileuploader 使用HTML5 API的jQuery文件上传插件,支持AJAX上传和拖拽操作,以及针对老版本浏览器的iframe上传部件.有多种形式来实现多文件上传,

JS组件系列——Bootstrap文件上传组件:bootstrap fileinput

原文:JS组件系列--Bootstrap文件上传组件:bootstrap fileinput 前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签,效果不忍直视,于是博主下定决心要找一个好看的上传组件换掉它.既然bootstrap开源,那么社区肯定有很多关于它的组件,肯定也有这种常见的上传组件吧.经过一番查找,功夫不负有心人,还是被博主找到了这个组件:

JS文件上传神器bootstrap fileinput详解

Bootstrap FileInput插件功能如此强大,完全没有理由不去使用,但是国内很少能找到本插件完整的使用方法,于是本人去其官网翻译了一下英文说明文档放在这里供英文不好的同学勉强查阅.另外附上一段调用方发和servlet端的接收代码,未完待续. 引言: 一个强化的HTML5 文件输入插件,适用于Bootstrap 3.x.本插件对多种类型的文件提供文件预览,并且提供了多选等功能.本插件还提供给你一个简单的方式去安装一个先进的文件选择/上传控制版本去配合Bootstrap CSS3样式.通过

Bootstrap文件上传组件

前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签,效果不忍直视,于是博主下定决心要找一个好看的上传组件换掉它.既然bootstrap开源,那么社区肯定有很多关于它的组件,肯定也有这种常见的上传组件吧.经过一番查找,功夫不负有心人,还是被博主找到了这个组件:bootstrap fileinput.关于这个组件的简单应用,博客园大牛伍华聪写过一篇基于M

jQuery插件之路(三)——文件上传(支持拖拽上传)

好了,这次咱一改往日的作风,就不多说废话了,哈哈.先贴上源代码地址,点击获取.然后直接进入主题啦,当然,如果你觉得我有哪里写的不对或者欠妥的地方,欢迎留言指出.在附上一些代码之前,我们还是先来了解下,上传文件的时候需要利用的一些必要的知识. 首先我们要说的就是FileReader对象,这是一个HTML5提出的,专门用来异步的读取用户计算机上文件的对象,这里有详细的介绍.所以如果我们想要使用它,那么首先我们得先创建一个FileReader对象. var fr = new FileReader()

Java实现HTML5拖拽文件上传

这是主页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+reques