整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JAVASCRIPT批量下载文件

JAVASCRIPT批量下载文件

AVASCRIPT批量下载文件,JS批量下载文件,HTML5批量下载文件,VUE批量下载文件,VUE2批量下载文件,VUE3批量下载文件,VUE-CLI批量下载文件,前端批量下载文件,网页批量下载文件,JAVASCRIPT批量下载文件断点续传,JAVASCRIPT加密批量下载文件,

批量下载,非打包下载,不是以打包方式下载,

在前端实现,在WEB上实现,在网页上实现,不是在后端实现,不是在服务器上下载,用户需要看到每一个文件的下载进度,下载速度信息,已经下载大小

不在服务器打包,而是在前端批量下载,用户可以控制每一个文件,可能 对单个文件进行暂停和续传,

文件有大有小,服务器打包的话太占资源,可能导致服务器崩溃,或者服务器磁盘空间不足,下载的人多的话,可能导致内存不足

示例:

https://gitee.com/xproer/down2-vue-cli

工程结构

启动测试环境

环境启动成功

可以看到界面

点击按钮,下载测试文件

下载测试文件代码

ava+http+上传文件夹,java上传文件夹,java上传文件夹解决方案,java上传文件夹思路,java上传文件夹实例,java上传大文件,java分块上传大文件,java分片上传大文件,java批量上传大文件,java加密上传大文件,

JSP实现大文件上传和下载,JSP实现大文件批量上传和下载,JSP实现大文件分块上传和下载,JSP实现大文件分片上传和下载,JSP实现大文件切片上传和下载,JSP实现文件夹上传和下载,JSP实现文件夹批量上传和下载,JSP实现大文件加密上传和下载,JSP实现大文件断点续传,JSP实现大文件多线程上传和下载,

java实现大视频上传,java实现大文件上传,java实现大文件分块上传,java实现大文件分片上传,java实现大文件切片上传,java实现大文件批量上传,java实现大文件加密上传,java实现文件夹上传,java实现大文件上传解决方案,java实现大文件上传实例,


java大文件10G上传,JSP大文件10G上传,JAVA大文件10G上传,断点续传。

一般这么大的文件不用HTML的一次性上传,而是采用分块,分片,分段,分割,切割技术上传。

JAVA话一般是负责后端的逻辑,比如文件初始化,文件块上传,合并,存储等。

前端的话用JSP,VUE2,VUE3,React,HTML5,JS,JQ都行。这个都无所谓。

网上一般的做法都是用的HTML5的API,也就是chrome提供的API,能够满足基本需求,但是还是有痛点,chrome限制死了,固定死了无法扩展,每个域名只允许5个TCP连接,导致了速度有上限,你也无法修改和扩展。然后就是浏览器也只能用chrome,用户用了IE就不行了,用户现有的系统跑在IE上,也不能换。

进度信息容易丢失,用户关闭网页,刷新网页,关闭浏览器,重启浏览器,关闭电脑,重启电脑后,进度信息都会丢失,无解,没办法。扩展性还是差了点。

传大文件,超大文件,文件数量多的话,前端就卡,网页反应慢,容易死,崩溃,在配置较差的电脑或者配置一般的电脑上这个痛点体现的非常明显。

客户是一个政府单位,现要求能够在网页上面上传文件夹,文件夹里面大约有1万多个文件,有大有小,大的有1G~10G,小的有几MB,

文件夹上传的时候需要保存层级结构,同时能够将层级结构信息保存到数据库中。要求支持断点续传,支持进度信息离线存储,用户可能传一半没有传完,下班了,明天上班后继续上传,电脑晚上到点需要关机,

断点续传,就是在文件上传的过程中发生了中断,人为因素(暂停)或者不可抗力(断网或者网络差)导致了文件上传到一半失败了。然后在环境恢复的时候,重新上传该文件,而不至于是从新开始上传的。

断点续传的功能是基于分块上传来实现的,把一个大文件分成很多个小块,服务端能够把每个上传成功的分块都落地下来,客户端在上传文件开始时调用接口快速验证,条件选择跳过某个分块。

实现原理,就是在每个文件上传前,就获取到文件MD5取值,在上传文件前调用接口,如果获取的文件状态是未完成,则返回所有的还没上传的分块的编号,然后前端进行条件筛算出哪些没上传的分块,然后进行上传。

当接收到文件块后就可以直接写入到服务器的文件中。


导入项目:
导入到Eclipse:
http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
导入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot统一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2



下载示例:

https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/




工程



NOSQL

NOSQL示例不需要任何配置,可以直接访问测试



创建数据表

选择对应的数据表脚本,这里以SQL为例




修改数据库连接信息


访问页面进行测试



文件存储路径

up6/upload/年/月/日/guid/filename






相关问题:
1.javax.servlet.http.HttpServlet错误
2.项目无法发布到tomcat
3.md5计算完毕后卡住
4.服务器找不到config.json文件

相关参考:

文件保存位置


源码工程文档:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

源码报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl



OEM版报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

产品源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授权生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1

简介】

拖放是一种常见的特性, 属于html5标准的一部分, 即抓取对象以后拖动到另一个位置, 在html5中, 任何元素都可被设置拖放。首先, 我们要给需要拖动的HTML元素启用拖动功能, 设置属性draggable="true",

<div draggable="true"></div>

提示:a标签和img标签默认是启用该属性的, 可不需要设置draggable属性。

draggable有三个值, 如下所示:

draggable=true(元素可以被拖动)

draggable=false(元素不能被拖动)

draggable=auto(浏览器可以自主决定某个元素是否可以被拖动)

【用法】

当我们用鼠标拖拽目标元素过程中会触发的事件:

ondragstart:用户按下鼠标开始拖动时触发

ondrag:用户正在拖动时反复触发

ondragend:用户结束拖动后触发

<img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

当拖动元素进入目标容器内触发的事件:

ondragenter:鼠标拖动对象进入释放区时触发

ondragover:被拖动物体进入目标容器内移动时反复触发

ondragleave:拖动对象在释放区没有释放就离开容器时触发

ondrop:被拖动物体在目标容器内释放时触发

<div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

ondragenter和ondragover事件的默认行为是拒绝接受任何被拖放的项目, 所以我们必须要做的最重要的事情就是防止这种默认行为的发生。

因此, 我们只需要在这两个事件调用的函数中传入event对象, 使用event.preventDefault()就可取消这种默认行为;举个例子, 在drop事件时, Firefox浏览器会关闭网页, 转而显示被拖动图片img元素src所引用的地址。

取消元素默认行为:

function ondragenterFun(e){
    e.preventDefault();
}
function ondragoverFun(e){
    e.preventDefault();
}

在event对象中, 我们会使用dataTransfer属性来获取DataTransfer对象, 在DataTransfer对象中有我们操作数据的属性和方法, 具体如下:

datatransfer:转移释放元素的数据到释放区, 返回Datatransfer对象

event.dataTransfer //返回DataTransfer对象

DataTransfer对象的属性:

files:处理从操作系统拖动并释放到释放区的文件;

types:返回一个字符串数组, 该对象包含了dataTransfer对象中数据的所有类型;

items:返回DataTransferItems对象, 该对象代表了拖动数据;

dropEffect:设置拖放目标允许发生的拖放行为, 如果此处设置的拖放行为不在effectAllowed属性设置的可拖放行为内, 拖放操作将会失败。该属性值只允许为"null"、"copy"、"link"或"move";

effectAllowed:设置拖动元素允许发生的拖动行为, 该属性值可为"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

DataTransfer对象的方法:

setData( format , data ):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据。

getData( format ):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。

clearData( [format] ):从dataTransfer对象中删除指定格式的数据,参数可选,若不给参数,将删除对象中所有的数据。

setDragImage(el, x, y):设置拖放操作的图标,其中el代表自定义图标,x代表图标与鼠标在水平方向上的距离,y代表图标与鼠标在垂直方向上的距离。


了解了H5拖动使用的api以后我们接下来看一个综合的案例, 功能如下:

1)、实现图片拖动功能;

2)、实现图片复制功能;

3)、过滤不能拖动的元素;

4)、实现拖动本地图片到浏览器指定位置;

公共css部分:

<style>
#dropIn{
border:1px solid #AAAAAA;
height:100px;
margin-bottom: 10px;
padding: 10px;
}
#dropIn>img{
margin-right: 10px;
border:2px solid deepskyblue;
}
img{
width:100px;
border-radius: 10px;
border:2px solid red;
}
</style>

html部分:

<body>
<div id="dropIn"></div> <!--释放区-->
<img id="drop1" src="img/a.png" alt="" />
<!--拖动的图片元素-->
</body>

js部分:

<script type="text/javascript">
var darggID;
function getId(el){
    return document.getElementById(el)
}
var dropId1=getId("drop1");
var dropInId=getId("dropIn");
//取消事件默认行为
dropInId.ondragenter=cancelDefault;
dropInId.ondragover=cancelDefault; //绑定拖动元素释放时触发的事件
dropInId.ondrop=drop; //绑定
dropId1.ondragstart=startFun;
function cancelDefault(ev){ //取消默认行为
    ev.preventDefault();
}
function startFun(ev){
    darggID=ev.target.id;
    //获取被拖动元素的id
    //从源对象上的事件处理中保存数据,数据类型为"Text"
    ev.dataTransfer.setData("Text",darggID);
}
function drop(ev){
    ev.preventDefault();
    // 从目标对象上的事件处理中读取"Text"类型数据
    var data=ev.dataTransfer.getData("Text");
    // 插入到目标对象中
    ev.target.appendChild(document.getElementById(data));
}
</script>

接下来我们添加两张图, "drop2"是实现复制的图片, "drop3"是既不能复制也不能拖动的图片;

<img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

添加js代码:

//获取页面元素
var dropId2=getId("drop2");
var dropId3=getId("drop3");
//绑定事件
dropId2.ondragstart=startFun;dropId3.ondragstart=startFun;
//修改drop函数为
function drop(ev){
    ev.preventDefault();
    // 从目标对象上的事件处理中读取"Text"类型数据
    var data=ev.dataTransfer.getData("Text");
    if(data=='drop1'){
    //移动
        ev.target.appendChild(document.getElementById(data));
    }
    if(data=='drop2'){//复制
        var nreEl=document.getElementById(darggID).cloneNode(false);
        getId("dropIn").appendChild(nreEl);
    }
    if(data=='drop3'){//过滤drop3,drop3不做任何操作
        alert('过滤drop3')
    }
}

接下来我们实现拖动本地图片到浏览器, 我们就将图片拖动到id为"dropIn"的这个div中;添加js:

/*document 监听drop 并阻止浏览器打开客户端的图片*/
document.ondragover=function (e) {
    //只有在ondragover中阻止默认行为
    e.preventDefault();
};
document.ondrop=function (e) {
    //阻止 document.ondrop的默认行为
    e.preventDefault();
};
//dropIn是div的id
dropIn.ondrop=function (e) {
    var list=e.dataTransfer.files;
    for (var i=0; i < list.length; i++) {
    var f=list[i];
        reader(f);
    }
};
function reader(f) {
    var reader=new FileReader();
    //读取数据
    reader.readAsDataURL(f);
    reader.onload=function () {
    var img=new Image();
    img.src=reader.result;
    dropIn.appendChild(img);
    }
}

【浏览器支持】

目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

最后再和大家分享一个技巧, 这种拖动行为还能跨浏览器工作, 这里说的跨浏览器不是浏览器之间的跨窗口, 而是可以从Chrome浏览器拖动到Firefox浏览器, 因为拖放功能的支持是集成在操作系统里面的, 有着相同的特性。