php大文件上传解决方案实例代码 – 泽优软件博客 http://blog.ncmem.com/wordpress 荆门泽优软件有限公司官方博客 Fri, 05 Jun 2026 07:40:50 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.7.5 超大文件上传和断点续传的实现 http://blog.ncmem.com/wordpress/2020/01/04/%e8%b6%85%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%92%8c%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e7%9a%84%e5%ae%9e%e7%8e%b0/ Sat, 04 Jan 2020 03:53:15 +0000 http://blog.ncmem.com/wordpress/?p=1852 继续阅读 超大文件上传和断点续传的实现]]> 之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需求,都能得到满足。小小开心了一把。

  但无论插件再怎么灵活,也难以应付所有的需求,比如,你要上传一个2G的文件。以现在我们的网速,恐怕再快也得传半小时。要命的是,如果你在上传到90%的时候不小心关掉了浏览器,或者是手一抖摁了F5,完了,一切还得从头再来。这种用户体验简直太糟糕了。所以,断点续传就十分有必要了。什么是续传我就不解释了,用QQ传文件这么多年,大家都见过了。

  这里要说的是断点续传都有哪些技术要点。使用传统的表单提交文件或是HTML5的FormData都是将文件“整块”提交,服务端取到该文件后再进行转移、重命名等操作,因此,无法实时保存文件的已上传部分。而且在http协议下,我们无法保持浏览器与服务端的长连接,不能以文件流的形式来提交。所以要解决的问题具体来讲有以下几点:

对上传的文件进行分割,每次只上传一小片。服务端接收到文件后追加到原来部分,最后合并成完整的文件。

每次上传文件片前先获取已上传的文件大小,确定本次应切割的位置

每次上传完成后更新已上传文件大小的记录

标识客户端和服务端的文件,保证不会把A文件的内容追加到B文件上

 

  在参考了张鑫旭大哥的这篇文章后,我将学到的技术应用在了我的插件Huploadify中,成功的添加了断点续传功能。在此将技术和插件都分享给大家。

工作原理/技术要点

  首先的首先,要明确,如果我们有一个10M的文件,每次切割上传1M,那么是需要发10次请求来完成的。在http协议下,只能这么搞。断点上传分三步来完成:

选择一个文件后,获取该文件在服务器上的大小,通过本地存储或自定义的函数来获取。

根据已上传大小切割文件,发出n次请求不断向服务器提交文件片,服务端不断追加文件内容

当已上传文件大小达到文件总大小时,上传结束 

 

  首先是文件的分割,HTML5新增了Blob数据类型,并且提供了一个可以分割数据的方法:slice(),其用法和字符串、数组的slice()方法一样,可以截取一个二进制文件的一部分。

  其次是文件片的保存与追加,我后台用PHP写的,先用file_get_contents获取文件的二进制格式,再用file_put_contents每次将文件追加,具体的写法可以参照后面,或者是下载我打包好的文件。

  接下来我们还需要实时保存已上传文件的大小,以便于下次上传前进行正确切割。使用HTML5的localStorage是一种方法,将已上传的大小保存在本地,下次上传前先从本地读取。不过这种方式是很局限的,抛开用户可能通过各种管家清除掉本地数据不讲,假如用户在A页面上传了一个文件的50%,然后在B页面想把该文件上传到另外一个地方,结果从本地一读文件已上传50%了,直接从51%的位置开始上传了,显然是个错误。问题就在于本地不能存太多的信息,通过File API只能获取到文件的原始名称,无法正确的与服务器上的文件正确匹配。所以真正在项目中用,还得依靠服务端来保存这些数据。

  关于如何将数据存在服务端,已经前端如何取数据,我在下面会讲到。

  技术要点就上面的那么多了,其实也没有多少技术含量哈~来看看我的插件如何使用吧。

续传功能的使用方法

  文件的引入就不讲了,可参考上一篇关于插件的介绍。关键点是新增的几个配置,先来看一下:

在服务端保存数据

  用户在使用上传的时候可能有各种你意想不到的操作,这里我发挥想象描述一下用户可能的行为:

同一台机器使用不同帐号登录,上传同一个文件

文件上传了一部分,然后修改了文件内容,再次上传

文件上传完成100%,再次上传该文件

同一个页面有多个上传按钮,上传同一个文件,或在不同页面上传同一个文件

 

  仅仅上面四条,是不是情况就够复杂了?再加上你系统还有自己的业务逻辑,所以在服务端保存已上传文件数据是非常有必要的。而且保存数据和获取数据的函数都交给你来定义,抱着插件有足够的灵活性。

  因为涉及到了服务端的技术,无法演示,我将我项目中的真实使用场景在此讲解一下,来展示一下如何自已定义方法来实现服务端保存数据的可靠上传。我定义的getUploadedSize函数如下:

文件初始化

 

文件上传完毕的代码

 

 

文件块的处理代码,up6对文件块的处理,以及文件续传的逻辑进行了大幅度的优化,开发者不需要关心续传的细节,因为up6默认就是自动续传

 

  我向后台的某个地址发送一个请求,传递文件名和文件的最后修改时间为参数,后台根据这两个参数来找到与前台所选择的文件对应的服务器上的文件,将服务器返回的文件大小return出去,来被插件使用。为什么要传递这两个参数呢?我们在前台无法知道服务器上的这个文件的名称,所以使用原始文件名作为一个辅助标识。为了防止用户在两次上传间隔修改了文件,我们把文件的最后修改时间也传给服务端,让服务端进行比较,若时间不对应则返回已上传大小为0,重新上传此文件。

  再来看后台都要做哪些工作。数据库中需要有一张表来记录每个已文件的情况,包含的字段大致有:

字段

描述

uid

用户ID

id

文件ID标识(唯一)

lenSvr

服务器文件大小

lenLoc

本地文件大小

blockOffset

文件块偏移(在整个文件中的位置)

blockSize

文件块大小

blockIndex

文件块索引(基于1)

blockMd5

文件块MD5

complete

当前文件是否已经传完

  根据client_filename和last_modified_date,再加上系统中的其他关联信息,可以定位到本次上传的文件在服务端的大小,然后返回给客户端。当然这是我自己的用法,你也可以根据自己的需求灵活设计。总之最终的目的就是要找到前台选择的文件在服务器上真正对应的文件,并将已上传大小正确返回。

  另外需注意的一点,就是在续传的第二步,不断提交文件片的过程中,也需要服务端准确定位到相应的文件,不能把A的数据追加到B上。采用的方式也是提交fileName和lastModifyDate两个参数(已写在插件内部,可服务端直接获取),服务端找到对应的文件进行追加。

  另外再啰嗦一句,后台获取文件的时候需要取成二进制的,而我们提交是使用FormData来提交的,所以PHP代码需要这么写:

file_put_contents(‘uploads/’.$filename,file_get_contents($_FILES[“file”][“tmp_name”]),FILE_APPEND);

  如果上面的说明还是不够清楚,就需要你自己来探索一下了,毕竟考虑到插件可能应用在复杂的系统中,很多工作还是需要你来做的。或者你也可以给我留言,我很乐意为你解答疑惑。

该版本的其他改动

  从1.0到2.0,Huploadify又新加了很多东西,不过只是新加,使用方式跟之前的没有变化。例如上面的断点续传功能,你如果不想使用,只需设置breakPoints为false即可,插件仍按照以前的方式工作。除了断点续传这个大头,插件还做了如下改动:

增加了onSelect回调函数,在选择了文件之后触发,用法与uploadify官网的一致

up6提供了3个事件,选择文件,选择文件夹,粘贴

用户选择文件时会触发open_files,选择文件夹触发open_folders,粘贴会触发以上两个事件,因为用户可能粘贴的文件和文件夹

删除掉正在上传的文件,中断发送请求

完善了input file组件的accept属性支持,浏览时只显示运行的文件格式,就是这个东东:

 

 

  4. 对外开放了方法调用接口,upload、stop、cancel、disable、ennable。我在demo中有演示。使用方法如下:var up = $(‘#upload’).Huploadify({

    auto:false,

    fileTypeExts:’*.jpg;*.png;*.exe;*.mp3;*.mp4;*.zip;*.doc;*.docx;*.ppt;*.pptx;*.xls;*.xlsx;*.pdf’,

    multi:true

});

 

up.upload(1);//开始上传文件,接收一个参数,表示上传第几个文件,可传入*上传队列中的所有文件

up.stop();//暂停上传队列中的所有文件,不接收参数。用于开启了断点需传

up.cancel(1);//删除队列中的某个文件,接收一个参数,表示删除第几个文件,可传入*删除队列中的所有文件

up.disable();//使选择文件按钮失效,不接收参数

up.ennable();//使选择文件按钮生效,不接收参数  5. 修改其他已知bug

结束

  插件刚刚完成,与我们的后端程序员调试完成了断点续传功能暂未发现问题,欢迎大家在使用的时候给我提任何问题。老实来讲这个功能使用起来还是挺费解的,为了最大程度的保证灵活做成这样,大家可以与我多多交流~

  我在demo中使用了本地存储来做已上传文件大小的保存,下载压缩包后可看一下效果。上传一个比较大的视频文件,上传到中间关闭浏览器,再次打开浏览器上传同一个文件,会看到从上次断掉的地方继续上传。

详细内容可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/09/%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/

]]>
网页大文件上传解决方案实例代码 http://blog.ncmem.com/wordpress/2020/01/04/%e7%bd%91%e9%a1%b5%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81/ Sat, 04 Jan 2020 03:11:32 +0000 http://blog.ncmem.com/wordpress/?p=1850 继续阅读 网页大文件上传解决方案实例代码]]> 相关资料:产品首页,控件包,白皮书,白皮书(图文版),产品介绍,产品比较,控件源码文档,个人版报价单,年费版采购说明,开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件,

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

        

产品交流群:泽优Web大文件上传控件

 

视频教程:https://www.bilibili.com/video/BV1uj411V75m/?vd_source=d1843c7f8c164416779b5188178bad8c

导入项目:
导入到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

 

环境:Windows + Tomcat8.0+

版本:6.5.41

示例:https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.41/

 

NOSQL

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

 

创建数据表

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

 

修改数据库连接信息

访问页面进行测试

 

文件存储路径

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

 

数据库记录  

 

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

相关参考:

文件保存位置

 

免费下载产品源代码-泽优全平台开源大文件传输解决方案(up6-down2)

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

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>
前端大文件上传解决方案实例代码 http://blog.ncmem.com/wordpress/2020/01/04/%e5%89%8d%e7%ab%af%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81/ Sat, 04 Jan 2020 02:33:57 +0000 http://blog.ncmem.com/wordpress/?p=1848 继续阅读 前端大文件上传解决方案实例代码]]> 相关资料:解决方案,白皮书,产品介绍,产品比较,开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件,

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

        

产品交流群:泽优Web大文件上传控件

视频教程:https://www.bilibili.com/video/BV1jm4y127Ut/?vd_source=d1843c7f8c164416779b5188178bad8c

环境:vue2-cli

示例:https://gitee.com/xproer/up6-vue-cli

 

1.下载示例

 

将up6组件复制到项目中

示例中已经包含此目录

 

1.引入up6组件

 

2.配置接口地址

接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表

参考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de

 

3.处理事件

 

启动测试

 

启动成功

 

访问测试页面

 

效果

 

数据库

 

下载产品源代码-泽优全平台开源大文件上传控件(up6)

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>
JavaScript大文件上传解决方案实例代码 http://blog.ncmem.com/wordpress/2020/01/04/javascript%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81/ Sat, 04 Jan 2020 01:52:29 +0000 http://blog.ncmem.com/wordpress/?p=1846 继续阅读 JavaScript大文件上传解决方案实例代码]]> 一、 功能性需求与非功能性需求

要求操作便利,一次选择多个文件和文件夹进行上传;
支持PC端全平台操作系统,Windows,Linux,Mac

支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。

支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同。

支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验;
支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。

支持断点续传,关闭浏览器或刷新浏览器后仍然能够保留进度。

支持文件夹结构管理,支持新建文件夹,支持文件夹目录导航

交互友好,能够及时反馈上传的进度;

服务端的安全性,不因上传文件功能导致JVM内存溢出影响其他功能使用;

最大限度利用网络上行带宽,提高上传速度;


二、 设计分析

对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传

从上传的效率来看,利用多线程并发上传能够达到最大效率。


三、解决方案:

文件上传页面的前端可以选择使用一些比较好用的上传组件,例如百度的开源组件WebUploader,泽优软件的up6,这些组件基本能满足文件上传的一些日常所需功能,如异步上传文件,文件夹,拖拽式上传,黏贴上传,上传进度监控,文件缩略图,甚至是大文件断点续传,大文件秒传。 

在web项目中上传文件夹现在已经成为了一个主流的需求。在OA,或者企业ERP系统中都有类似的需求。上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便。能够提供更高级的应用支撑。

文件夹数据表结构

CREATE TABLE IF NOT EXISTS `up6_folders` (

  `f_id`               char(32) NOT NULL ,

  `f_nameLoc`               varchar(255) default ”,

  `f_pid`                   char(32) default ”,

  `f_uid`                   int(11) default ‘0’,

  `f_lenLoc`           bigint(19) default ‘0’,

  `f_sizeLoc`               varchar(50) default ‘0’,

  `f_pathLoc`               varchar(255) default ”,

  `f_pathSvr`               varchar(255) default ”,

  `f_pathRel`               varchar(255) default ”,

  `f_folders`               int(11) default ‘0’,

  `f_fileCount`        int(11) default ‘0’,

  `f_filesComplete`    int(11) default ‘0’,

  `f_complete`              tinyint(1) default ‘0’,

  `f_deleted`               tinyint(1) default ‘0’,

  `f_time`                  timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

  `f_pidRoot`               char(32) default ”,

  PRIMARY KEY  (`f_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

文件数据表结构

CREATE TABLE IF NOT EXISTS `up6_files` (

  `f_id`               char(32) NOT NULL,

  `f_pid`                   char(32) default ”,        /*父级文件夹ID*/

  `f_pidRoot`               char(32) default ”,        /*根级文件夹ID*/

  `f_fdTask`           tinyint(1) default ‘0’,     /*是否是一条文件夹信息*/

  `f_fdChild`               tinyint(1) default ‘0’,     /*是否是文件夹中的文件*/

  `f_uid`                   int(11) default ‘0’,

  `f_nameLoc`               varchar(255) default ”,    /*文件在本地的名称(原始文件名称)*/

  `f_nameSvr`               varchar(255) default ”,    /*文件在服务器的名称*/

  `f_pathLoc`               varchar(512) default ”,    /*文件在本地的路径*/

  `f_pathSvr`               varchar(512) default ”,    /*文件在远程服务器中的位置*/

  `f_pathRel`               varchar(512) default ”,

  `f_md5`                   varchar(40) default ”,     /*文件MD5*/

  `f_lenLoc`           bigint(19) default ‘0’,     /*文件大小*/

  `f_sizeLoc`               varchar(10) default ‘0’,    /*文件大小(格式化的)*/

  `f_pos`                   bigint(19) default ‘0’,     /*续传位置*/

  `f_lenSvr`           bigint(19) default ‘0’,     /*已上传大小*/

  `f_perSvr`           varchar(7) default ‘0%’,    /*已上传百分比*/

  `f_complete`              tinyint(1) default ‘0’,     /*是否已上传完毕*/

  `f_time`                  timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

  `f_deleted`               tinyint(1) default ‘0’,

  `f_scan`                  tinyint(1) default ‘0’,

  PRIMARY KEY  (`f_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。

* 如何分片;

* 如何合成一个文件;

* 中断了从哪个分片开始。

如何分,利用强大的js库,来减轻我们的工作,市场上已经能有关于大文件分块的轮子,虽然程序员的天性曾迫使我重新造轮子。但是因为时间的关系还有工作的关系,我只能罢休了。最后我选择了百度的WebUploader来实现前端所需。

如何合,在合之前,我们还得先解决一个问题,我们如何区分分块所属那个文件的。刚开始的时候,我是采用了前端生成了唯一uuid来做文件的标志,在每个分片请求上带上。不过后来在做秒传的时候我放弃了,采用了Md5来维护分块和文件关系。

在服务端合并文件,和记录分块的问题,在这方面其实行业已经给了很好的解决方案了。参考迅雷,你会发现,每次下载中的时候,都会有两个文件,一个文件主体,另外一个就是文件临时文件,临时文件存储着每个分块对应字节位的状态。

这些都是需要前后端密切联系才能做好,前端需要根据固定大小对文件进行分片,并且请求中要带上分片序号和大小。前端发送请求顺利到达后台后,服务器只需要按照请求数据中给的分片序号和每片分块大小(分片大小是固定且一样的)算出开始位置,与读取到的文件片段数据,写入文件即可。

为了便于开发,我 将服务端的业务逻辑进行了如下划分,分成初始化,块处理,文件上传完毕等。

服务端的业务逻辑模块如下

 

 

功能分析:

文件夹生成模块

 

文件夹上传完毕后由服务端进行扫描代码如下

public class fd_scan

{

    DbHelper db;

    Connection con;

    PreparedStatement cmd_add_f = null;

    PreparedStatement cmd_add_fd = null;

    public FileInf root = null;//根节点

   

    public fd_scan()

    {

        this.db = new DbHelper();

        this.con = this.db.GetCon();       

    }

   

    public void makeCmdF()

    {

        StringBuilder sb = new StringBuilder();

        sb.append(“insert into up6_files (“);

        sb.append(” f_id”);//1

        sb.append(“,f_pid”);//2

        sb.append(“,f_pidRoot”);//3

        sb.append(“,f_fdTask”);//4

        sb.append(“,f_fdChild”);//5

        sb.append(“,f_uid”);//6

        sb.append(“,f_nameLoc”);//7

        sb.append(“,f_nameSvr”);//8

        sb.append(“,f_pathLoc”);//9

        sb.append(“,f_pathSvr”);//10

        sb.append(“,f_pathRel”);//11

        sb.append(“,f_md5”);//12

        sb.append(“,f_lenLoc”);//13

        sb.append(“,f_sizeLoc”);//14

        sb.append(“,f_lenSvr”);//15

        sb.append(“,f_perSvr”);//16

        sb.append(“,f_complete”);//17

       

        sb.append(“) values(“);

       

        sb.append(” ?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“)”);

 

        try {

            this.cmd_add_f = this.con.prepareStatement(sb.toString());

            this.cmd_add_f.setString(1, “”);//id

            this.cmd_add_f.setString(2, “”);//pid

            this.cmd_add_f.setString(3, “”);//pidRoot

            this.cmd_add_f.setBoolean(4, true);//fdTask

            this.cmd_add_f.setBoolean(5, false);//f_fdChild

            this.cmd_add_f.setInt(6, 0);//f_uid

            this.cmd_add_f.setString(7, “”);//f_nameLoc

            this.cmd_add_f.setString(8, “”);//f_nameSvr

            this.cmd_add_f.setString(9, “”);//f_pathLoc

            this.cmd_add_f.setString(10, “”);//f_pathSvr

            this.cmd_add_f.setString(11, “”);//f_pathRel

            this.cmd_add_f.setString(12, “”);//f_md5

            this.cmd_add_f.setLong(13, 0);//f_lenLoc

            this.cmd_add_f.setString(14, “”);//f_sizeLoc

            this.cmd_add_f.setLong(15, 0);//f_lenSvr            

            this.cmd_add_f.setString(16, “”);//f_perSvr

            this.cmd_add_f.setBoolean(17, true);//f_complete

        } catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

   

    public void makeCmdFD()

    {

        StringBuilder sb = new StringBuilder();

        sb.append(“insert into up6_folders (“);

        sb.append(” f_id”);//1

        sb.append(“,f_pid”);//2

        sb.append(“,f_pidRoot”);//3

        sb.append(“,f_nameLoc”);//4

        sb.append(“,f_uid”);//5

        sb.append(“,f_pathLoc”);//6

        sb.append(“,f_pathSvr”);//7

        sb.append(“,f_pathRel”);//8

        sb.append(“,f_complete”);//9

        sb.append(“) values(“);//

        sb.append(” ?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“,?”);

        sb.append(“)”);

 

        try {

            this.cmd_add_fd = this.con.prepareStatement(sb.toString());

            this.cmd_add_fd.setString(1, “”);//id

            this.cmd_add_fd.setString(2, “”);//pid

            this.cmd_add_fd.setString(3, “”);//pidRoot

            this.cmd_add_fd.setString(4, “”);//name

            this.cmd_add_fd.setInt(5, 0);//f_uid

            this.cmd_add_fd.setString(6, “”);//pathLoc

            this.cmd_add_fd.setString(7, “”);//pathSvr

            this.cmd_add_fd.setString(8, “”);//pathRel

            this.cmd_add_fd.setBoolean(9, true);//complete

        } catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

   

    protected void GetAllFiles(FileInf inf,String root)

    {

        File dir = new File(inf.pathSvr);

        File [] allFile = dir.listFiles();

        for(int i = 0; i < allFile.length; i++)

        {

            if(allFile[i].isDirectory())

            {

                FileInf fd = new FileInf();

                String uuid = UUID.randomUUID().toString();

                uuid = uuid.replace(“-“, “”);

                fd.id = uuid;

                fd.pid = inf.id;

                fd.pidRoot = this.root.id;

                fd.nameSvr = allFile[i].getName();

                fd.nameLoc = fd.nameSvr;

                fd.pathSvr = allFile[i].getPath();

                fd.pathSvr = fd.pathSvr.replace(“\\”, “/”);

                fd.pathRel = fd.pathSvr.substring(root.length() + 1);

                fd.perSvr = “100%”;

                fd.complete = true;

                this.save_folder(fd);

               

                this.GetAllFiles(fd, root);

            }

            else

            {

                FileInf fl = new FileInf();

                String uuid = UUID.randomUUID().toString();

                uuid = uuid.replace(“-“, “”);

                fl.id = uuid;

                fl.pid = inf.id;

                fl.pidRoot = this.root.id;

                fl.nameSvr = allFile[i].getName();

                fl.nameLoc = fl.nameSvr;

                fl.pathSvr = allFile[i].getPath();

                fl.pathSvr = fl.pathSvr.replace(“\\”, “/”);

                fl.pathRel = fl.pathSvr.substring(root.length() + 1);

                fl.lenSvr = allFile[i].length();

                fl.lenLoc = fl.lenSvr;

                fl.perSvr = “100%”;

                fl.complete = true;

                this.save_file(fl);

            }

        }

    }

   

    protected void save_file(FileInf f)

    {      

        try {

            this.cmd_add_f.setString(1, f.id);//id

            this.cmd_add_f.setString(2, f.pid);//pid

            this.cmd_add_f.setString(3, f.pidRoot);//pidRoot

            this.cmd_add_f.setBoolean(4, f.fdTask);//fdTask

            this.cmd_add_f.setBoolean(5, true);//f_fdChild

            this.cmd_add_f.setInt(6, f.uid);//f_uid

            this.cmd_add_f.setString(7, f.nameLoc);//f_nameLoc

            this.cmd_add_f.setString(8, f.nameSvr);//f_nameSvr

            this.cmd_add_f.setString(9, f.pathLoc);//f_pathLoc

            this.cmd_add_f.setString(10, f.pathSvr);//f_pathSvr

            this.cmd_add_f.setString(11, f.pathRel);//f_pathRel

            this.cmd_add_f.setString(12, f.md5);//f_md5

            this.cmd_add_f.setLong(13, f.lenLoc);//f_lenLoc

            this.cmd_add_f.setString(14, f.sizeLoc);//f_sizeLoc

            this.cmd_add_f.setLong(15, f.lenSvr);//f_lenSvr        

            this.cmd_add_f.setString(16, f.perSvr);//f_perSvr

            this.cmd_add_f.setBoolean(17, f.complete);//f_complete

            this.cmd_add_f.executeUpdate();

        } catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }//

    }

   

    protected void save_folder(FileInf f)

    {

        try {

            this.cmd_add_fd.setString(1, f.id);//id

            this.cmd_add_fd.setString(2, f.pid);//pid

            this.cmd_add_fd.setString(3, f.pidRoot);//pidRoot

            this.cmd_add_fd.setString(4, f.nameSvr);//name

            this.cmd_add_fd.setInt(5, f.uid);//f_uid

            this.cmd_add_fd.setString(6, f.pathLoc);//pathLoc

            this.cmd_add_fd.setString(7, f.pathSvr);//pathSvr

            this.cmd_add_fd.setString(8, f.pathRel);//pathRel

            this.cmd_add_fd.setBoolean(9, f.complete);//complete

            this.cmd_add_fd.executeUpdate();

        } catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

   

    public void scan(FileInf inf, String root) throws IOException, SQLException

    {

        this.makeCmdF();

        this.makeCmdFD();

        this.GetAllFiles(inf, root);

        this.cmd_add_f.close();

        this.cmd_add_fd.close();

        this.con.close();

    }

}

 

分块上传,分块处理逻辑应该是最简单的逻辑了,up6已经将文件进行了分块,并且对每个分块数据进行了标识,这些标识包括文件块的索引,大小,偏移,文件MD5,文件块MD5(需要开启)等信息,服务端在接收这些信息后便可以非常方便的进行处理了。比如将块数据保存到分布式存储系统中

分块上传可以说是我们整个项目的基础,像断点续传、暂停这些都是需要用到分块。

分块这块相对来说比较简单。前端是采用了webuploader,分块等基础功能已经封装起来,使用方便。

借助webUpload提供给我们的文件API,前端就显得异常简单。

前台HTML模板

this.GetHtmlFiles = function()

{

     var acx = “”;

     acx += ‘<div class=”file-item” id=”tmpFile” name=”fileItem”>\

                <div class=”img-box”><img name=”file” src=”js/file.png”/></div>\

                   <div class=”area-l”>\

                       <div class=”file-head”>\

                            <div name=”fileName” class=”name”>HttpUploader程序开发.pdf</div>\

                            <div name=”percent” class=”percent”>(35%)</div>\

                            <div name=”fileSize” class=”size” child=”1″>1000.23MB</div>\

                    </div>\

                       <div class=”process-border”><div name=”process” class=”process”></div></div>\

                       <div name=”msg” class=”msg top-space”>15.3MB 20KB/S 10:02:00</div>\

                   </div>\

                   <div class=”area-r”>\

                    <span class=”btn-box” name=”cancel” title=”取消”><img name=”stop” src=”js/stop.png”/><div>取消</div></span>\

                    <span class=”btn-box hide” name=”post” title=”继续”><img name=”post” src=”js/post.png”/><div>继续</div></span>\

                       <span class=”btn-box hide” name=”stop” title=”停止”><img name=”stop” src=”js/stop.png”/><div>停止</div></span>\

                       <span class=”btn-box hide” name=”del” title=”删除”><img name=”del” src=”js/del.png”/><div>删除</div></span>\

                   </div>’;

     acx += ‘</div>’;

     acx += ‘<div class=”file-item” name=”folderItem”>\

                   <div class=”img-box”><img name=”folder” src=”js/folder.png”/></div>\

                   <div class=”area-l”>\

                       <div class=”file-head”>\

                            <div name=”fileName” class=”name”>HttpUploader程序开发.pdf</div>\

                            <div name=”percent” class=”percent”>(35%)</div>\

                            <div name=”fileSize” class=”size” child=”1″>1000.23MB</div>\

                    </div>\

                       <div class=”process-border top-space”><div name=”process” class=”process”></div></div>\

                       <div name=”msg” class=”msg top-space”>15.3MB 20KB/S 10:02:00</div>\

                   </div>\

                   <div class=”area-r”>\

                    <span class=”btn-box” name=”cancel” title=”取消”><img name=”stop” src=”js/stop.png”/><div>取消</div></span>\

                    <span class=”btn-box hide” name=”post” title=”继续”><img name=”post” src=”js/post.png”/><div>继续</div></span>\

                       <span class=”btn-box hide” name=”stop” title=”停止”><img name=”stop” src=”js/stop.png”/><div>停止</div></span>\

                       <span class=”btn-box hide” name=”del” title=”删除”><img name=”del” src=”js/del.png”/><div>删除</div></span>\

                   </div>’;

     acx += ‘</div>’;

     acx += ‘<div class=”files-panel” name=”post_panel”>\

                   <div name=”post_head” class=”toolbar”>\

                       <span class=”btn” name=”btnAddFiles”>选择多个文件</span>\

                       <span class=”btn” name=”btnAddFolder”>选择文件夹</span>\

                       <span class=”btn” name=”btnPasteFile”>粘贴文件和目录</span>\

                       <span class=”btn” name=”btnSetup”>安装控件</span>\

                   </div>\

                   <div class=”content” name=”post_content”>\

                       <div name=”post_body” class=”file-post-view”></div>\

                   </div>\

                   <div class=”footer” name=”post_footer”>\

                       <span class=”btn-footer” name=”btnClear”>清除已完成文件</span>\

                   </div>\

              </div>’;

     return acx;

};

 

分则必合。把大文件分片了,但是分片了就没有原本文件功能,所以我们要把分片合成为原本的文件。我们只需要把分片按原本位置写入到文件中去。因为前面原理那一部我们已经讲到了,我们知道分块大小和分块序号,我就可以知道该分块在文件中的起始位置。所以这里使用RandomAccessFile是明智的,RandomAccessFile能在文件里面前后移动。但是在andomAccessFile的绝大多数功能,已经被JDK1.4的NIO的“内存映射文件(memory-mapped files)”取代了。我在该项目中分别写了使用RandomAccessFile与MappedByteBuffer来合成文件。分别对应的方法是uploadFileRandomAccessFile和uploadFileByMappedByteBuffer。两个方法代码如下。

秒传功能

服务端逻辑

秒传功能,相信大家都体现过了,网盘上传的时候,发现上传的文件秒传了。其实原理稍微有研究过的同学应该知道,其实就是检验文件MD5,记录下上传到系统的文件的MD5,在一个文件上传前先获取文件内容MD5值或者部分取值MD5,然后在匹配系统上的数据。

Breakpoint-http实现秒传原理,客户端选择文件之后,点击上传的时候触发获取文件MD5值,获取MD5后调用系统一个接口(/index/checkFileMd5),查询该MD5是否已经存在(我在该项目中用redis来存储数据,用文件MD5值来作key,value是文件存储的地址。)接口返回检查状态,然后再进行下一步的操作。相信大家看代码就能明白了。

嗯,前端的MD5取值也是用了webuploader自带的功能,这还是个不错的工具。

控件计算完文件MD5后会触发md5_complete事件,并传值md5,开发者只需要处理这个事件即可,

 

断点续传

up6已经自动对断点续传进行了处理,不需要开发都再进行单独的处理。

在f_post.jsp中接收这些参数,并进行处理,开发者只需要关注业务逻辑,不需要关注其它的方面。

 

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

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

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

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

这是文件夹上传完后的效果

 

这是文件夹上传完后在服务端的存储结构

 

参考文章:http://blog.ncmem.com/wordpress/2019/08/12/java-http%E5%A4%A7%E6%96%87%E4%BB%B6%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0%E4%B8%8A%E4%BC%A0/

]]>
php大文件上传解决方案实例代码 http://blog.ncmem.com/wordpress/2020/01/03/php%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81/ Fri, 03 Jan 2020 06:05:53 +0000 http://blog.ncmem.com/wordpress/?p=1831 继续阅读 php大文件上传解决方案实例代码]]> 相关资料:解决方案,白皮书,产品介绍,产品比较,开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,控件包,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件,

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

        

产品交流群:泽优Web大文件上传控件

视频教程:https://www.bilibili.com/video/BV1im4y117ht/?vd_source=d1843c7f8c164416779b5188178bad8c

 

版本:6.5.41

代码:https://gitee.com/xproer/up6-php/tree/6.5.41/

 

安装环境

PHP:7.2.14

调整块大小

 

NOSQL

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

 

SQL

创建数据库

您可以直接复制脚本进行创建

创建表

 

配置数据库连接

6.安装依赖

 

访问页面进行测试

 

数据表中的数据

相关参考:

文件保存位置

php5教程

免费下载产品源代码-泽优开源全平台大文件传输解决方案(up6-down2)

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

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>
asp.net大文件上传解决方案实例代码 http://blog.ncmem.com/wordpress/2020/01/03/asp-net%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81/ Fri, 03 Jan 2020 03:59:49 +0000 http://blog.ncmem.com/wordpress/?p=1829 继续阅读 asp.net大文件上传解决方案实例代码]]> IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。

 

一. 两个必要响应头Accept-Ranges、ETag

        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传的下载:

Accept-Ranges:告知下载客户端这是一个可以恢复续传的下载,存放本次下载的开始字节位置、文件的字节大小;

ETag:保存文件的唯一标识(我在用的文件名+文件最后修改时间,以便续传请求时对文件进行验证);

Last-Modified:可选响应头,存放服务端文件的最后修改时间,用于验证

 

二. 一个重要请求头Range

Range:首次下载时,Range头为null,此时服务端的响应头中必须添加响应头Accept-Ranges、ETag;

              续传请求时,其值表示客户端已经收到的字节数,即本次下载的开始字节位置,服务端依据这个 值从相应位置读取数据发送到客户端。

 

三. 用于验证的请求头If-Range、

       当响应头中包含有Accept-Ranges、ETag时,续传请求时,将包含这些请求头:

If-Range:对应响应头ETag的值;

Unless-Modified-Since:对应响应头Last-Modified的值。

        续传请求时,为了保证客户端与服务端的文件的一致性和正确性,有必要对文件进行验证,验证需要自己写验证代码,就根据解析这两个请求头的值,将客户端已下载的部分与服务端的文件进行对比,如果不吻合,则从头开始下载,如果吻合,则断点续传。

 

四.  速度限制

        程序中加入了速度限制,用于对客户端进行权限控制的流量限制。

 

五. 其它注意事项

      如:文件名乱码的问题、文件名中空格变加号、强制客户端显示下载对话框等,详见源码注释:

  1

  2        /// <summary>

  3        /// 下载文件,支持大文件、续传、速度限制。支持续传的响应头Accept-Ranges、ETag,请求头Range 。

  4        /// Accept-Ranges:响应头,向客户端指明,此进程支持可恢复下载.实现后台智能传输服务(BITS),值为:bytes;

  5        /// ETag:响应头,用于对客户端的初始(200)响应,以及来自客户端的恢复请求,

  6        /// 必须为每个文件提供一个唯一的ETag值(可由文件名和文件最后被修改的日期组成),这使客户端软件能够验证它们已经下载的字节块是否仍然是最新的。

  7        /// Range:续传的起始位置,即已经下载到客户端的字节数,值如:bytes=1474560- 。

  8        /// 另外:UrlEncode编码后会把文件名中的空格转换中+(+转换为%2b),但是浏览器是不能理解加号为空格的,所以在浏览器下载得到的文件,空格就变成了加号;

  9        /// 解决办法:UrlEncode 之后, 将 “+” 替换成 “%20″,因为浏览器将%20转换为空格

 10        /// </summary>

 11        /// <param name=”httpContext”>当前请求的HttpContext</param>

 12        /// <param name=”filePath”>下载文件的物理路径,含路径、文件名</param>

 13        /// <param name=”speed”>下载速度:每秒允许下载的字节数</param>

 14        /// <returns>true下载成功,false下载失败</returns>

 15        public static bool DownloadFile(HttpContext httpContext, string filePath, long speed)

 16        {

 17            bool ret = true;

 18            try

 19            {

 20                –验证:HttpMethod,请求的文件是否存在

 36

 37                定义局部变量

 49

 50                –验证:文件是否太大,是否是续传,且在上次被请求的日期之后是否被修改过————–

 67

 68                try

 69                {

 70                    ——-添加重要响应头、解析请求头、相关验证——————-

 97

 98                    ——-向客户端发送数据块——————-

108                }

109                catch

110                {

111                    ret = false;

112                }

113                finally

114                {

115                    br.Close();

116                    myFile.Close();

117                }

118            }

119            catch

120            {

121                ret = false;

122            }

123            return ret;

124        }

上传展示截图:

说明: http://bbsres2.ncmem.com/0456aab2.jpg

详细配置信息可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/09/net%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/

 

]]>
如何分发大文件、大文件传输解决方案-JS http://blog.ncmem.com/wordpress/2020/01/02/%e5%a6%82%e4%bd%95%e5%88%86%e5%8f%91%e5%a4%a7%e6%96%87%e4%bb%b6%e3%80%81%e5%a4%a7%e6%96%87%e4%bb%b6%e4%bc%a0%e8%be%93%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88-js/ Thu, 02 Jan 2020 10:04:20 +0000 http://blog.ncmem.com/wordpress/?p=1825 继续阅读 如何分发大文件、大文件传输解决方案-JS]]> 前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践。该博客重在实践。

 

一. Http协议原理简介 

    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

    简单来说,就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。

 1.特点:

  (1)支持客户/服务器模式。

  (2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

  (3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

  (4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

  (5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

  注意:其中(4)(5)是面试中常用的面试题。虽然HTTP协议(应用层)是无连接,无状态的,但其所依赖的TCP协议(传输层)却是常连接、有状态的,而TCP协议(传输层)又依赖于IP协议(网络层)。

 2.HTTP消息的结构

 (1)Request 消息分为3部分,第一部分叫请求行, 第二部分叫http header消息头, 第三部分是body正文,header和body之间有个空行, 结构如下图

 

 (2)Response消息的结构, 和Request消息的结构基本一样。 同样也分为三部分,第一部分叫request line状态行, 第二部分叫request header消息体,第三部分是body正文, header和body之间也有个空行,  结构如下图

 

 

下面是使用Fiddler捕捉请求baidu的Request消息机构和Response消息机构:

 

因为没有输入任何表单信息,故request的消息正文为空,大家可以找一个登录的页面试试看。

先到这里,HTTP协议的知识网上很丰富,在这里就不再熬述了。

 

二. 文件上传的三种实现

1. Jsp/servlet 实现文件上传

这是最常见也是最简单的方式

(1)实现文件上传的Jsp页面 

(2)负责接文件的FileUploadServlet

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

// @WebServlet(name = “FileLoadServlet”, urlPatterns = {“/fileload”})

public class FileLoadServlet extends HttpServlet {

    private static Logger logger = Logger.getLogger(FileLoadServlet.class);

    private static final long serialVersionUID = 1302377908285976972L;

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        logger.info(“———— FileLoadServlet ————“);

        if (request.getContentLength() > 0) {           

               InputStream inputStream = null;

               FileOutputStream outputStream = null;              

            try {               

                inputStream = request.getInputStream();

                // 给新文件拼上时间毫秒,防止重名

                long now = System.currentTimeMillis();

                File file = new File(“c:/”, “file-” + now + “.txt”);

                file.createNewFile();

                outputStream = new FileOutputStream(file);

                  byte temp[] = new byte[1024];

                  int size = -1;

                  while ((size = inputStream.read(temp)) != -1) { // 每次读取1KB,直至读完

                      outputStream.write(temp, 0, size);

                  }               

                  logger.info(“File load success.”);

              } catch (IOException e) {

                  logger.warn(“File load fail.”, e);

                  request.getRequestDispatcher(“/fail.jsp”).forward(request, response);

              } finally {

                  outputStream.close();

                  inputStream.close();

              }

          }       

          request.getRequestDispatcher(“/succ.jsp”).forward(request, response);

      }   

  }

FileUploadServlet的配置,推荐采用servlet3.0注解的方式更方便

<servlet>

    <servlet-name>FileLoadServlet</servlet-name>

    <servlet-class>com.juxinli.servlet.FileLoadServlet</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>FileLoadServlet</servlet-name>

    <url-pattern>/fileload</url-pattern>

</servlet-mapping>

 

(3)运行效果

 

点击”submit”

 

页面转向文件上传成功的页面,再去C盘看看,发现多了一个文件:file-1433417127748.txt,这个就是刚上传的文件

 

 

我们打开看看,发现和原来的文本有些不一样

             

结合前面讲的HTTP协议的消息结构,不难发现这些文本就是去掉”请求头”后的”Request消息体”。所以,如果要得到与上传文件一致的文本,还需要一些字符串操作,这些就留给大家了。

另外,大家可以试试一个Jsp页面上传多个文件,会有不一样的精彩哦o(∩_∩)o ,不解释。

 

2. 模拟Post请求/servlet 实现文件上传

刚才我们是使用Jsp页面来上传文件,假如客户端不是webapp项目呢,显然刚才的那种方式有些捉襟见衬了。

这里我们换种思路,既然页面上通过点击可以实现文件上传,为何不能通过HttpClient来模拟浏览器发送上传文件的请求呢。关于HttpClient ,大家可以自己去了解。

 (1)还是这个项目,启动servlet服务

 (2)模拟请求的FileLoadClient

import java.io.BufferedReader;

import java.io.File;

import java.io.InputStream;

import java.io.InputStreamReader;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.HttpStatus;

import org.apache.commons.httpclient.methods.PostMethod;

import org.apache.commons.httpclient.methods.multipart.FilePart;

import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;

import org.apache.commons.httpclient.methods.multipart.Part;

import org.apache.log4j.Logger;

public class FileLoadClient {

    private static Logger logger = Logger.getLogger(FileLoadClient.class);

    public static String fileload(String url, File file) {

        String body = “{}”;

        if (url == null || url.equals(“”)) {

            return “参数不合法”;

        }

        if (!file.exists()) {

            return “要上传的文件名不存在”;

        }

 

        PostMethod postMethod = new PostMethod(url);

        try {           

            // FilePart:用来上传文件的类,file即要上传的文件

            FilePart fp = new FilePart(“file”, file);

            Part[] parts = { fp };

            // 对于MIME类型的请求,httpclient建议全用MulitPartRequestEntity进行包装

            MultipartRequestEntity mre = new MultipartRequestEntity(parts, postMethod.getParams());

            postMethod.setRequestEntity(mre);

            HttpClient client = new HttpClient();

            // 由于要上传的文件可能比较大 , 因此在此设置最大的连接超时时间

            client.getHttpConnectionManager().getParams() .setConnectionTimeout(50000);

            int status = client.executeMethod(postMethod);

            if (status == HttpStatus.SC_OK) {

                InputStream inputStream = postMethod.getResponseBodyAsStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

                StringBuffer stringBuffer = new StringBuffer();

                String str = “”;

                while ((str = br.readLine()) != null) {

                    stringBuffer.append(str);

                }               

                body = stringBuffer.toString();               

            } else {

                body = “fail”;

            }

        } catch (Exception e) {

            logger.warn(“上传文件异常”, e);

        } finally {

            // 释放连接

            postMethod.releaseConnection();

        }        

        return body;

    }   

   

    public static void main(String[] args) throws Exception {

        String body = fileload(“http://localhost:8080/jsp_upload-servlet/fileload”, new File(“C:/1111.txt”));

        System.out.println(body);

    }    

}

 

(3)在Eclipse中运行FileLoadClient程序来发送请求,运行结果:

<html><head>  <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ /></head><body><h2>File upload success</h2><a href=”index.jsp”>return</a></body></html>

打印了:文件上传成功的succ.jsp页面

 

有没有发现什么,是不是和前面Jsp页面上传的结果类似?对的,还是去掉”请求头”后的”Request消息体”。 

这种方式也很简单,负责接收文件的FileUploadServlet没有变,只要在客户端把文件读取到流中,然后模拟请求servlet就行了。

 3.模拟Post请求/Controller(SpringMvc)实现文件上传

 终于到第三种方式了,主要难点在于搭建maven+jetty+springmvc环境,接收文件的service和模拟请求的客户端 和上面相似。

 (1)模拟请求的FileLoadClient未变

import java.io.BufferedReader;

import java.io.File;

import java.io.InputStream;

import java.io.InputStreamReader;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.HttpStatus;

import org.apache.commons.httpclient.methods.PostMethod;

import org.apache.commons.httpclient.methods.multipart.FilePart;

import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;

import org.apache.commons.httpclient.methods.multipart.Part;

import org.apache.log4j.Logger;

public class FileLoadClient {   

    private static Logger logger = Logger.getLogger(FileLoadClient.class);

    public static String fileload(String url, File file) {

        String body = “{}”;       

        if (url == null || url.equals(“”)) {

            return “参数不合法”;

        }

        if (!file.exists()) {

            return “要上传的文件名不存在”;

        }

        PostMethod postMethod = new PostMethod(url);       

        try {           

            // FilePart:用来上传文件的类,file即要上传的文件

            FilePart fp = new FilePart(“file”, file);

            Part[] parts = { fp };

            // 对于MIME类型的请求,httpclient建议全用MulitPartRequestEntity进行包装

            MultipartRequestEntity mre = new MultipartRequestEntity(parts, postMethod.getParams());

            postMethod.setRequestEntity(mre);

            HttpClient client = new HttpClient();

            // 由于要上传的文件可能比较大 , 因此在此设置最大的连接超时时间

            client.getHttpConnectionManager().getParams() .setConnectionTimeout(50000);

            int status = client.executeMethod(postMethod);

            if (status == HttpStatus.SC_OK) {

                InputStream inputStream = postMethod.getResponseBodyAsStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

                StringBuffer stringBuffer = new StringBuffer();

                String str = “”;

                while ((str = br.readLine()) != null) {

                    stringBuffer.append(str);

                }               

                body = stringBuffer.toString();                

            } else {

                body = “fail”;

            }

        } catch (Exception e) {

            logger.warn(“上传文件异常”, e);

        } finally {

            // 释放连接

            postMethod.releaseConnection();

        }       

        return body;

    }   

    public static void main(String[] args) throws Exception {

        String body = fileload(“http://localhost:8080/fileupload/upload”, new File(“C:/1111.txt”));

        System.out.println(body);

    }

}

 

(2)servlet换为springMvc中的Controller

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

 

@Controller

@RequestMapping(“/fileupload”)

public class FileUploadService {

    private Logger logger = Logger.getLogger(FileUploadService.class);

    @RequestMapping(consumes = “multipart/form-data”, value = “/hello”, method = RequestMethod.GET)

    public void hello(HttpServletRequest request, HttpServletResponse response) throws IOException {        

        response.getWriter().write(“Hello, jetty server start ok.”);

    }

    @RequestMapping(consumes = “multipart/form-data”, value = “/upload”, method = RequestMethod.POST)

    public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {

        String result = “”;

        if (request.getContentLength() > 0) {           

               InputStream inputStream = null;

               FileOutputStream outputStream = null;              

            try {

                inputStream = request.getInputStream();

                // 给新文件拼上时间毫秒,防止重名

                long now = System.currentTimeMillis();

                File file = new File(“c:/”, “file-” + now + “.txt”);

                file.createNewFile();

                outputStream = new FileOutputStream(file);               

                byte temp[] = new byte[1024];

                int size = -1;

                while ((size = inputStream.read(temp)) != -1) { // 每次读取1KB,直至读完

                    outputStream.write(temp, 0, size);

                }

                logger.info(“File load success.”);

                result = “File load success.”;

            } catch (IOException e) {

                logger.warn(“File load fail.”, e);

                result = “File load fail.”;

            } finally {

                outputStream.close();

                inputStream.close();

            }

        }       

        response.getWriter().write(result);

    }

}

 

 (3)启动jetty的核心代码,在Eclipse里面右键可以启动,也可以把项目打成jar报启动

import org.apache.log4j.Logger;

import org.eclipse.jetty.server.Connector;

import org.eclipse.jetty.server.Server;

import org.eclipse.jetty.server.ServerConnector;

import org.eclipse.jetty.webapp.WebAppContext;

public class Launcher

{   

    private static Logger logger = Logger.getLogger(Launcher.class);

    private static final int PORT = 8080;

    private static final String WEBAPP = “src/main/webapp”;

    private static final String CONTEXTPATH = “/”;

    private static final String DESCRIPTOR = “src/main/webapp/WEB-INF/web.xml”;

    /*

     * 创建 Jetty Server,指定其端口、web目录、根目录、web路径

     * @param port

     * @param webApp

     * @param contextPath

     * @param descriptor

     * @return Server

     */

    public static Server createServer(int port, String webApp, String contextPath, String descriptor) {

        Server server = new Server();

        //设置在JVM退出时关闭Jetty的钩子

        //这样就可以在整个功能测试时启动一次Jetty,然后让它在JVM退出时自动关闭

        server.setStopAtShutdown(true);

        ServerConnector connector = new ServerConnector(server);

        connector.setPort(port);

        //解决Windows下重复启动Jetty不报告端口冲突的问题

        //在Windows下有个Windows + Sun的connector实现的问题,reuseAddress=true时重复启动同一个端口的Jetty不会报错

        //所以必须设为false,代价是若上次退出不干净(比如有TIME_WAIT),会导致新的Jetty不能启动,但权衡之下还是应该设为False

        connector.setReuseAddress(false);

        server.setConnectors(new Connector[]{connector});

        WebAppContext webContext = new WebAppContext(webApp, contextPath);

        webContext.setDescriptor(descriptor);

        // 设置webapp的位置

        webContext.setResourceBase(webApp);

        webContext.setClassLoader(Thread.currentThread().getContextClassLoader());

        server.setHandler(webContext);       

        return server;

    }

    /**

     * 启动jetty服务

     */

    public void startJetty() {

        final Server server = Launcher.createServer(PORT, WEBAPP, CONTEXTPATH, DESCRIPTOR);

        try {

            server.start();

            server.join();           

        } catch (Exception e) {

            logger.warn(“启动 jetty server 失败”, e);

            System.exit(-1);

        }

    }

 

    public static void main(String[] args) {       

        (new Launcher()).startJetty();

        // jetty 启动后的测试url

        // http://localhost:8080/fileupload/hello

    }   

}

springMvc的配置不贴了,大家可以下载源码下来看。

 

(4)运行效果

上传包含1W个文件的文件夹,正常

 

大型文件续传功能正常 。

 

文件批量上传正常

 

服务器中已经根据日期+GUID生成了目录

数据库中也有记录

后端代码逻辑大部分是相同的,目前能够支持MySQL,Oracle,SQL。在使用前需要配置一下数据库,可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/12/java-http%E5%A4%A7%E6%96%87%E4%BB%B6%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0%E4%B8%8A%E4%BC%A0/

]]>
如何分发大文件、大文件传输解决方案-HTML5 http://blog.ncmem.com/wordpress/2020/01/02/%e5%a6%82%e4%bd%95%e5%88%86%e5%8f%91%e5%a4%a7%e6%96%87%e4%bb%b6%e3%80%81%e5%a4%a7%e6%96%87%e4%bb%b6%e4%bc%a0%e8%be%93%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88-html5/ Thu, 02 Jan 2020 09:49:01 +0000 http://blog.ncmem.com/wordpress/?p=1823 继续阅读 如何分发大文件、大文件传输解决方案-HTML5]]> 一、概述

 

所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。

 

二、Range 

 

用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:

 

    Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始。典型格式:

    Ranges:    (unit=first byte pos)-[last byte pos]

    Ranges:    bytes=4000- 下载从第4000字节开始到文件结束部分

    Ranges:    bytes=0~N 下载第0-N字节范围的内容

    Ranges:    bytes=M-N 下载第M-N字节范围的内容

    Ranges:    bytes=-N 下载最后N字节内容

 

1.以下几点需要注意:

(1)这个数据区间是个闭合区间,起始值是0,所以“Range: bytes=0-1”这样一个请求实际上是在请求开头的2个字节。

(2)“Range: bytes=-200”,它不是表示请求文件开始位置的201个字节,而是表示要请求文件结尾处的200个字节。

(3)如果last byte pos小于first byte pos,那么这个Range请求就是无效请求,server需要忽略这个Range请求,然后回应一个200,把整个文件发给client。

(4)如果last byte pos大于等于文件长度,那么这个Range请求被认为是不能满足的,server需要回应一个416,Requested range not satisfiable。

 

2.示例解释:

表示头500个字节:bytes=0-499  

表示第二个500字节:bytes=500-999  

表示最后500个字节:bytes=-500  

表示500字节以后的范围:bytes=500-  

第一个和最后一个字节:bytes=0-0,-1  

同时指定几个范围:bytes=500-600,601-999 

 

三、Content-Range

 

用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式: 

 

Content-Range: bytes (unit first byte pos) – [last byte pos]/[entity legth] 

 

四、Header示例

 

请求下载整个文件: 

 

GET /test.rar HTTP/1.1 

Connection: close 

Host: 116.1.219.219 

Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头

 

一般正常回应 

 

HTTP/1.1 200 OK 

Content-Length: 801      

Content-Type: application/octet-stream 

Content-Range: bytes 0-800/801 //801:文件总大小

一个最简单的断点续传实现大概如下:

1.客户端下载一个1024K的文件,已经下载了其中512K

2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:

Range:bytes=512000-

这个头通知服务端从文件的512K位置开始传输文件

3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:

Content-Range:bytes 512000-/1024000

并且此时服务端返回的HTTP状态码应该是206,而不是200。

但是在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时我们需要有一个标识文件唯一性的方法。在RFC2616中也有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时RFC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识,比如文件的MD5值。

终端在发起续传请求时应该在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。

另外RFC2616中同时定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。


相关参考链接:http://blog.ncmem.com/wordpress/2019/08/09/http%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/

]]>
如何分发大文件、大文件传输解决方案-WebUploader http://blog.ncmem.com/wordpress/2020/01/02/%e5%a6%82%e4%bd%95%e5%88%86%e5%8f%91%e5%a4%a7%e6%96%87%e4%bb%b6%e3%80%81%e5%a4%a7%e6%96%87%e4%bb%b6%e4%bc%a0%e8%be%93%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88-webuploader/ Thu, 02 Jan 2020 08:37:14 +0000 http://blog.ncmem.com/wordpress/?p=1821 继续阅读 如何分发大文件、大文件传输解决方案-WebUploader]]> 相关资料:解决方案,白皮书,产品介绍,产品比较,开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件,

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

        

产品交流群:泽优Web大文件上传控件

视频教程:https://www.bilibili.com/video/BV1jm4y127Ut/?vd_source=d1843c7f8c164416779b5188178bad8c

环境:vue2-cli

示例:https://gitee.com/xproer/up6-vue-cli

 

1.下载示例

 

将up6组件复制到项目中

示例中已经包含此目录

 

1.引入up6组件

 

2.配置接口地址

接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表

参考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de

 

3.处理事件

 

启动测试

 

启动成功

 

访问测试页面

 

效果

 

数据库

 

下载产品源代码-泽优全平台开源大文件上传控件(up6)

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>
如何分发大文件、文件夹传输解决方案 http://blog.ncmem.com/wordpress/2020/01/02/%e5%a6%82%e4%bd%95%e5%88%86%e5%8f%91%e5%a4%a7%e6%96%87%e4%bb%b6%e3%80%81%e6%96%87%e4%bb%b6%e5%a4%b9%e4%bc%a0%e8%be%93%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/ Thu, 02 Jan 2020 07:05:22 +0000 http://blog.ncmem.com/wordpress/?p=1819 继续阅读 如何分发大文件、文件夹传输解决方案]]> 版权所有 2009-2024 荆门泽优软件有限公司

保留所有权利

相关资料:产品首页,白皮书,白皮书(图文版),产品介绍,产品比较,成功案例,基础组件,控件源代码,个人版报价单,年费版采购说明,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件,

标杆案例:中国港湾中国中车中国石油中国石化,长江电力中信证券上海通用一汽大众,沈阳自动化研究所,

报价单:个人版报价单,政企版(上传),政企版(上传下载),年费版(上传),年费版(上传下载),OEM版(上传),OEM版(上传下载),控件源码文档,源码版(上传下载),

解决方案:党政央企国防军工房地产档案管理教育医疗工程管理企业文件传输解决方案

控件包:cab(x86)控件包,cab(x64)控件包,chrome(45-)控件包,firefox控件包,exe安装包,exe安装包(开机启动),集成包(up6+down2),macOS控件包,Linux-x86-deb安装包,Linux-x86-deb集成包(up6+down2),linux-x86-uos安装包,linux-x86-uos集成包(up6+down2),linux-x86-rpm安装包,linux-x86-rpm集成包(up6+down2),linux-arm-deb安装包,linux-arm-deb集成包(up6+down2),linux-arm-uos安装包,linux-arm-uos集成包(up6+down2),linux-arm-rpm安装包,linux-arm-rpm集成包(up6+down2),linux-mips-deb安装包,linux-mips-deb集成包(up6+down2),linux-mips-uos安装包,linux-mips-uos集成包(up6+down2),linux-loongarch-deb安装包,linux-loongarch-deb集成包(up6+down2),linux-loongarch-uos安装包,linux-loongarch-uos集成包(up6+down2),linux-loongarch-rpm安装包

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,jsp-eclipse-sm4加密存储,jsp-springboot-sm4加密存储,asp.net-sm4加密存储

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

       

产品交流群:泽优Web大文件上传控件

 

视频教程:https://www.ixigua.com/7227314770696012322

导入项目:
导入到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

]]>
如何分发大文件、大文件断点续传解决方案 http://blog.ncmem.com/wordpress/2020/01/02/%e5%a6%82%e4%bd%95%e5%88%86%e5%8f%91%e5%a4%a7%e6%96%87%e4%bb%b6%e3%80%81%e5%a4%a7%e6%96%87%e4%bb%b6%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/ Thu, 02 Jan 2020 05:36:17 +0000 http://blog.ncmem.com/wordpress/?p=1817 继续阅读 如何分发大文件、大文件断点续传解决方案]]> 相关资料:解决方案,白皮书,产品介绍,产品比较产品源代码开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,deb包安装,rpm包安装,安装引导,控件部署,控件升级,IE9加载控件,IE8加载控件,
示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)
教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6
源码编译:ActiveX(x86)ActiveX(x64)npapiNativeMessagemacOSLinux(兆芯,海光)arm(鲲鹏,飞腾)龙芯(mips)龙芯(loongarch),
视频教程:解决方案,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,sm4加密传输,压缩传输,
ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)
jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),
jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)
jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs
php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),
二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程
相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,
联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,
        

 

视频教程:https://www.bilibili.com/video/BV1uj411V75m/?vd_source=d1843c7f8c164416779b5188178bad8c

导入项目:
导入到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

 

环境:Windows + Tomcat8.0+

版本:6.5.41

示例:https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.41/

 

NOSQL

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

 

创建数据表

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

 

修改数据库连接信息

访问页面进行测试

 

文件存储路径

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

 

数据库记录  

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

相关参考:

文件保存位置

 

免费下载产品源代码-泽优全平台开源大文件传输解决方案(up6-down2)

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

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>
怎么实现web端上传文件夹,保留层级结构 http://blog.ncmem.com/wordpress/2020/01/02/%e6%80%8e%e4%b9%88%e5%ae%9e%e7%8e%b0web%e7%ab%af%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e5%a4%b9%e4%bf%9d%e7%95%99%e5%b1%82%e7%ba%a7%e7%bb%93%e6%9e%84/ Thu, 02 Jan 2020 02:36:34 +0000 http://blog.ncmem.com/wordpress/?p=1815 继续阅读 怎么实现web端上传文件夹,保留层级结构]]> 相关资料:产品首页,控件包,白皮书,白皮书(图文版),产品介绍,产品比较,成功案例,基础组件,控件源代码,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件,

标杆案例:中国港湾中国中车中国石油中国石化,长江电力中信证券上海通用一汽大众,沈阳自动化研究所,

解决方案:党政央企国防军工房地产档案管理教育医疗工程管理企业文件传输解决方案

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,jsp-eclipse-sm4加密存储,jsp-springboot-sm4加密存储,asp.net-sm4加密存储

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

       

产品交流群:泽优Web大文件上传控件

 

视频教程:https://www.ixigua.com/7227314770696012322

导入项目:
导入到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

 

下载示例:
版本:6.5.41

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

 

 

工程

 

NOSQL

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

 

创建数据表

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

 

修改数据库连接信息

访问页面进行测试

 

文件存储路径

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

 

 

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

相关参考:

文件保存位置

 

免费下载报价单和产品源代码

大文件上传控件(up6)

个人版:http://www.ncmem.com/webapp/up6/purchase.aspx

政企版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=ent

年费版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=year

OEM版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=oem

源码版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=code

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

 

大文件上传下载控件(up6-down2)

政企版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=ent

年费版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=year

OEM版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=oem

源码版:http://www.ncmem.com/webapp/up6/purchase.aspx?type=code

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

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>
怎么实现web端上传超大文件,分片上传 http://blog.ncmem.com/wordpress/2020/01/02/%e6%80%8e%e4%b9%88%e5%ae%9e%e7%8e%b0web%e7%ab%af%e4%b8%8a%e4%bc%a0%e8%b6%85%e5%a4%a7%e6%96%87%e4%bb%b6%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0/ Thu, 02 Jan 2020 01:44:11 +0000 http://blog.ncmem.com/wordpress/?p=1813 继续阅读 怎么实现web端上传超大文件,分片上传]]> 版权所有 2009-2024 荆门泽优软件有限公司

保留所有权利

相关资料:产品首页,白皮书,白皮书(图文版),产品介绍,产品比较,控件源码文档,开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件

报价单:个人版报价单,政企版(上传),政企版(上传下载),年费版(上传),年费版(上传下载),OEM版(上传),OEM版(上传下载),控件源码文档,源码版(上传下载)

解决方案:党政央企国防军工房地产档案管理教育医疗工程管理企业文件传输解决方案

控件包:cab(x86)控件包,cab(x64)控件包,chrome(45-)控件包,firefox控件包,exe安装包,exe安装包(开机启动),集成包(up6+down2),macOS控件包,Linux-x86-deb安装包,Linux-x86-deb集成包(up6+down2),linux-x86-uos安装包,linux-x86-uos集成包(up6+down2),linux-x86-rpm安装包,linux-x86-rpm集成包(up6+down2),linux-arm-deb安装包,linux-arm-deb集成包(up6+down2),linux-arm-uos安装包,linux-arm-uos集成包(up6+down2),linux-arm-rpm安装包,linux-arm-rpm集成包(up6+down2),linux-mips-deb安装包,linux-mips-deb集成包(up6+down2),linux-mips-uos安装包,linux-mips-uos集成包(up6+down2),linux-mips-银河麒麟安装包,linux-mips-银河麒麟集成包(up6+down2)

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,jsp-eclipse-sm4加密存储,jsp-springboot-sm4加密存储,asp.net-sm4加密存储

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

       

 

视频教程:https://www.bilibili.com/video/BV1uj411V75m/?vd_source=d1843c7f8c164416779b5188178bad8c

导入项目:
导入到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

最新示例是6.5.39版本,下载时请注意选择最新分支。

 

工程

 

NOSQL

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

 

创建数据表

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

 

修改数据库连接信息

访问页面进行测试

 

文件存储路径

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

 

 

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

相关参考:

文件保存位置

]]>
怎么实现网页上传超大文件,断点续传 http://blog.ncmem.com/wordpress/2019/12/31/%e6%80%8e%e4%b9%88%e5%ae%9e%e7%8e%b0%e7%bd%91%e9%a1%b5%e4%b8%8a%e4%bc%a0%e8%b6%85%e5%a4%a7%e6%96%87%e4%bb%b6%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/ Tue, 31 Dec 2019 10:10:31 +0000 http://blog.ncmem.com/wordpress/?p=1810 继续阅读 怎么实现网页上传超大文件,断点续传]]> 相关资料:解决方案,白皮书,产品介绍,产品比较产品源代码开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,deb包安装,rpm包安装,安装引导,控件部署,控件升级,IE9加载控件,IE8加载控件,
示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)
教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6
源码编译:ActiveX(x86)ActiveX(x64)npapiNativeMessagemacOSLinux(兆芯,海光)arm(鲲鹏,飞腾)龙芯(mips)龙芯(loongarch),
视频教程:解决方案,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,sm4加密传输,压缩传输,
ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)
jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),
jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)
jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs
php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),
二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程
相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,
联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,
        

视频教程:https://www.bilibili.com/video/BV1jm4y127Ut/?vd_source=d1843c7f8c164416779b5188178bad8c

环境:vue2-cli

示例:https://gitee.com/xproer/up6-vue-cli

 

1.下载示例

 

将up6组件复制到项目中

示例中已经包含此目录

 

1.引入up6组件

 

2.配置接口地址

接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表

参考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de

 

3.处理事件

 

启动测试

 

启动成功

 

访问测试页面

 

效果

 

数据库

 

下载产品源代码-泽优全平台开源大文件上传控件(up6)

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>
怎么实现web端上传超大文件-WebUploader http://blog.ncmem.com/wordpress/2019/12/31/%e6%80%8e%e4%b9%88%e5%ae%9e%e7%8e%b0web%e7%ab%af%e4%b8%8a%e4%bc%a0%e8%b6%85%e5%a4%a7%e6%96%87%e4%bb%b6-webuploader/ Tue, 31 Dec 2019 07:33:42 +0000 http://blog.ncmem.com/wordpress/?p=1808 继续阅读 怎么实现web端上传超大文件-WebUploader]]> 相关资料:产品首页,白皮书,控件包,白皮书(图文版),产品介绍,产品比较,开发文档,成功案例,基础组件,示例下载,控件包,控件升级,在线演示,在线文档,并发能力,上传速度,下载速度,Windows控件安装,macOS控件安装,Linux-deb控件安装,Linux-rpm控件安装,安装引导,控件布署,控件升级,IE9加载控件,IE8加载控件,

标杆案例:中国港湾中国中车中国石油中国石化,长江电力中信证券上海通用一汽大众,沈阳自动化研究所,

解决方案:党政央企国防军工房地产档案管理教育医疗工程管理企业文件传输解决方案

示例下载:asp.net-vs2013,asp.net-vs2010,jsp-eclipse,jsp-springboot,jsp-myeclipse,php,vue-cil,WinForm(C#),C++(WTL)

教程:WinForm(C#)测试,WTL(C++)测试,在vue.js中使用,在vue-cli中使用,eclipse导入up6

视频教程:windows控件安装,mac控件安装,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS Express测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,jsp-eclipse-sm4加密存储,jsp-springboot-sm4加密存储,asp.net-sm4加密存储

ASP.NET教程:asp.net,IIS Express,IIS,IIS-Https,Oracle,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-eclipse教程:测试教程,oracle,mysql,SQL Server,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs),

jsp-springboot教程:测试教程,minio,fastdfs,阿里云对象存储(oss),华为云对象存储(obs)

jsp-myeclipse教程:mysql,oracle,SQL Server,fastdfs

php教程:测试教程,minio,fastdfs,阿里云对象存储(oss),

二次开发:组件引用,自定义事件,自定义业务字段,自定义文件保存路径,授权码,加密存储,加密传输,使用Minio存储,使用FastDFS存储,使用达梦数据库,数据表字段设计,监控fd_create流程,监控f_create流程,监控f_list.jsp流程

相关问题:WebSocket连接失败,md5计算完毕后卡住,域名未授权,网站安全系统拦截,

联系我们:QQ:1269085759(技术),QQ:3040217208(售后),QQ:1085617561(商务),微信:13235643658,邮箱:1269085759@qq.com,1085617561@qq.com,qwl@ncmem.com,

       

产品交流群:泽优Web大文件上传控件


视频教程:
https://www.ixigua.com/7226245960341389859

 

1.下载示例

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

 

 

up6组件复制到项目中

示例中已经包含此目录

 

 

1.引入up6组件

 

 

2.配置接口地址

接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表

参考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de

 

 

3.处理事件

 

 

启动测试

 

 

启动成功

 

 

效果

 

 

数据库

 

 

大文件上传控件(up6

个人版:http://www.ncmem.com/webapp/up6/purchase.aspx

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

免费下载源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

免费下载授权器:https://drive.weixin.qq.com/s?k=ACoAYgezAAw0P06owX

]]>