html大文件分片传输

我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。

首先我们需要了解的是上传文件三要素:

1.表单提交方式:post (get方式提交有大小限制,post没有)

2.表单的enctype属性:必须设置为multipart/form-data.

3.表单必须有文件上传项:file,且文件项需要给定name值

上传文件夹需要增加一个属性webkitdirectory,像这样:

不过webkitdirectory属性有个问题,只能支持高版本的chrome,不能支持低版本的IE,如ie6,ie7,ie8,不能做到全浏览器适配,运行环境比较单一。

js中可以判断文件夹中文件数量及文件夹大小是否符合要求,不符合要求不能向后台提交:

前台HTML模板

this.GetHtmlFiles = function()

var acx = “”;

acx += ‘

//文件夹模板

acx += ‘

//上传列表

acx += ‘

return acx;

选择文件,选择文件夹,粘贴文件和文件夹的逻辑

this.open_files = function (json)

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

this.addFileLoc(json.files[i]);

setTimeout(function () { _this.PostFirst(); },500);

this.open_folders = function (json)

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

this.addFolderLoc(json.folders[i]);

setTimeout(function () { _this.PostFirst(); }, 500);

this.paste_files = function (json)

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

this.addFileLoc(json.files[i]);

后台在接收文件夹时不同之处在需要用MultipartHttpServletRequest

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

List files = null;

try

files = upload.parseRequest(request);

catch (FileUploadException e)

{// 解析文件数据错误

out.println(“read file data error:” + e.toString());

return;

FileItem rangeFile = null;

// 得到所有上传的文件

Iterator fileItr = files.iterator();

// 循环处理所有文件

while (fileItr.hasNext())

// 得到当前文件

rangeFile = (FileItem) fileItr.next();

if(StringUtils.equals( rangeFile.getFieldName(),”pathSvr”))

pathSvr = rangeFile.getString();

pathSvr = PathTool.url_decode(pathSvr);

server端的包和类

文件块处页面,验证代码部分

boolean verify = false;

String msg = “”;

String md5Svr = “”;

long blockSizeSvr = rangeFile.getSize();

if(!StringUtils.isBlank(blockMd5))

md5Svr = Md5Tool.fileToMD5(rangeFile.getInputStream());

verify = Integer.parseInt(blockSize) == blockSizeSvr;

if(!verify)

msg = “block size error sizeSvr:” + blockSizeSvr + “sizeLoc:” + blockSize;

if(verify && !StringUtils.isBlank(blockMd5))

verify = md5Svr.equals(blockMd5);

if(!verify) msg = “block md5 error”;

if(verify)

//保存文件块数据

FileBlockWriter res = new FileBlockWriter();

//仅第一块创建

if( Integer.parseInt(blockIndex)==1) res.CreateFile(pathSvr,Long.parseLong(lenLoc));

res.write( Long.parseLong(blockOffset),pathSvr,rangeFile);

up6_biz_event.file_post_block(id,Integer.parseInt(blockIndex));

JSONObject o = new JSONObject();

o.put(“msg”, “ok”);

o.put(“md5”, md5Svr);

o.put(“offset”, blockOffset);//基于文件的块偏移位置

msg = o.toString();

rangeFile.delete();

out.write(msg);

生成文件名称的逻辑

public String genFile(int uid, String md5,String nameLoc) throws IOException

SimpleDateFormat fmtDD = new SimpleDateFormat(“dd”);

SimpleDateFormat fmtMM = new SimpleDateFormat(“MM”);

SimpleDateFormat fmtYY = new SimpleDateFormat(“yyyy”);

Date date = new Date();

String strDD = fmtDD.format(date);

String strMM = fmtMM.format(date);

String strYY = fmtYY.format(date);

String path = this.getRoot() + “/”;

path = path.concat(strYY);

path = path.concat(“/”);

path = path.concat(strMM);

path = path.concat(“/”);

path = path.concat(strDD);

path = path.concat(“/”);

path = path.concat(md5);

path = path.concat(“.”);

path = path.concat(PathTool.getExtention(nameLoc));

File fl = new File(path);

return fl.getCanonicalPath();//

以下是service层做的处理:

整体模块划分如下:

其中数据类实体逻辑处理如下

public class FileInf {

public FileInf(){}

public String id=””;

public String pid=””;

public String pidRoot=””;

/* * 表示当前项是否是一个文件夹项。 /

public boolean fdTask=false;

// /// 是否是文件夹中的子文件 ///

public boolean fdChild=false;

/* * 用户ID。与第三方系统整合使用。 /

public int uid=0;

/* * 文件在本地电脑中的名称 /

public String nameLoc=””;

/* * 文件在服务器中的名称。 /

public String nameSvr=””;

/* * 文件在本地电脑中的完整路径。示例:D:\Soft\QQ2012.exe /

public String pathLoc=””;

/* * 文件在服务器中的完整路径。示例:F:\ftp\uer\md5.exe /

public String pathSvr=””;

/* * 文件在服务器中的相对路径。示例:/www/web/upload/md5.exe /

public String pathRel=””;

/* * 文件MD5 /

public String md5=””;

/* * 数字化的文件长度。以字节为单位,示例:120125 /

public long lenLoc=0;

/* * 格式化的文件尺寸。示例:10.03MB /

public String sizeLoc=””;

/* * 文件续传位置。 /

public long offset=0;

/* * 已上传大小。以字节为单位 /

public long lenSvr=0;

/* * 已上传百分比。示例:10% /

public String perSvr=”0%”;

public boolean complete=false;

public Date PostedTime = new Date();

public boolean deleted=false;

/* * 是否已经扫描完毕,提供给大型文件夹使用,大型文件夹上传完毕后开始扫描。 /

public boolean scaned=false;

后台数据库中的逻辑基本上都用到了上面的实体类

文件数据表操作类如下

加载所有未完成的文件列表

public String GetAllUnComplete(int f_uid)

StringBuilder sb = new StringBuilder();

sb.append(“select “);

sb.append(” f_id”);

sb.append(“,f_fdTask”);

sb.append(“,f_nameLoc”);

sb.append(“,f_pathLoc”);

sb.append(“,f_md5”);

sb.append(“,f_lenLoc”);

sb.append(“,f_sizeLoc”);

sb.append(“,f_pos”);

sb.append(“,f_lenSvr”);

sb.append(“,f_perSvr”);

sb.append(“,f_complete”);

sb.append(“,f_pathSvr”);//fix(2015-03-16):修复无法续传文件的问题。

sb.append(” from up6_files “);//change(2015-03-18):联合查询文件夹数据

sb.append(” where f_uid=? and f_deleted=0 and f_fdChild=0 and f_complete=0 and f_scan=0″);//fix(2015-03-18):只加载未完成列表

ArrayList files = new ArrayList();

DbHelper db = new DbHelper();

PreparedStatement cmd = db.GetCommand(sb.toString());

try {

cmd.setInt(1, f_uid);

ResultSet r = db.ExecuteDataSet(cmd);

while(r.next())

FileInf f = new FileInf();

f.uid = f_uid;

f.id = r.getString(1);

f.fdTask = r.getBoolean(2);

f.nameLoc = r.getString(3);

f.pathLoc = r.getString(4);

f.md5 = r.getString(5);

f.lenLoc = r.getLong(6);

f.sizeLoc = r.getString(7);

f.offset = r.getLong(8);

f.lenSvr = r.getLong(9);

f.perSvr = r.getString(10);

f.complete = r.getBoolean(11);

f.pathSvr = r.getString(12);//fix(2015-03-19):修复无法续传文件的问题。

files.add(f);

r.close();

cmd.getConnection().close();

cmd.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

if(files.size() < 1) return null;

Gson g = new Gson();

return g.toJson( files);//bug:arrFiles为空时,此行代码有异常

实现后的整体效果如下

文件夹上传完后的效果

服务器保存的文件夹数据,而且层级结构与本地客户端是一致的。这在OA系统中,或者网盘系统中使用时是非常有用的

欢迎入群一起讨论”374992201″

Original: https://www.cnblogs.com/songsu/p/14927450.html
Author: Xproer-松鼠
Title: html大文件分片传输

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546070/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • tree shaking sideEffects

    参考:https://blog.csdn.net/u012961419/article/details/107094056/ webpack通过配置optimization.sid…

    技术杂谈 2023年5月31日
    088
  • 计算机系统实验

    实验三 一 实验目的 理解堆栈结构,利用缓冲区进行代码攻击 二 准备工作 配置实验环境(IDA、gcc),阅读实验指导书 三 实验过程 0x01第一关 首先理解堆栈的结构 /* 第…

    技术杂谈 2023年7月11日
    071
  • Python地图栅格化实例

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月24日
    065
  • 上周热点回顾(6.20-6.26)

    热点随笔: · 基于Vite+React构建在线Excel (葡萄城技术团队)· CentOS中实现基于Docker部署BI数据分析 (葡萄城技术团队)· MAUI与Blazor共…

    技术杂谈 2023年5月31日
    095
  • java学习之MybBaits

    0x00前言 我前面使用的jdbc和jdbc的工具类集成的但是它们在少部分代码的情况下会会简单,但是以后如果项目较大jdbc的固定代码会很难维护,如果使用框架会简单很多,也标志着j…

    技术杂谈 2023年6月21日
    098
  • PriorityBlockingQueue详解

    PriorityBlockingQueue介绍 【1】PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,也可以指定数组的长度,且…

    技术杂谈 2023年7月24日
    060
  • PyQt5 控件层级关系

    ################################ PyQt5中文网 – PyQt5全套视频教程 # https://www.PyQt5.cn/ # 主讲: 村长 #…

    技术杂谈 2023年5月31日
    099
  • 《鹿柴》王维

    《鹿柴》王维 空山不见人,但闻人语响。 返景入深林,复照青苔上。 posted @2022-08-01 08:20 郑瀚Andrew 阅读(503 ) 评论() 编辑 Origin…

    技术杂谈 2023年5月31日
    098
  • 高通量测序数据的存储、分析和管理

    以后,随着自己课题组建立起来,数据不断积累,良好的管理系统就必不可少了。 关键点: 测序raw data的存储与初步分析 下游分析processed data的存储与分析 数据的深…

    技术杂谈 2023年5月31日
    095
  • 定制化知识图谱 项目介绍

    宣传网站 http://dingzhitupu.com/ 定制化知识图谱 根据您的业务特性,通过图分析、建模,创建专门适合与您业务逻辑的专有知识图谱 特性介绍 用户不必懂相关技术 …

    技术杂谈 2023年5月31日
    0109
  • 62.可

    sdfdsf posted @2022-09-28 08:36 随遇而安== 阅读(4 ) 评论() 编辑 Original: https://www.cnblogs.com/55…

    技术杂谈 2023年6月21日
    0104
  • 二进制状态压缩

    二进制状态压缩 取出整数n在二进制表示下的第k位: (n>>k)&1 取出整数n在二进制下的第0~k-1位 n&((1<<k)-1) &lt…

    技术杂谈 2023年7月11日
    079
  • Ansible的介绍与安装

    Ansible的介绍与安装 1、自动化与linux系统管理(为什么要学习自动化运维) ​ 大多系统管理和基础架构管理都依赖于通过图形或者命令行用户界面执行的手动任务,系统管理员通常…

    技术杂谈 2023年6月21日
    0126
  • SpringCloud+Alibaba微服务教程,Java自学/进阶程序员必看

    正文 Spring Cloud是目前市面上最火爆的Java微服务技术栈,因其功能丰富涉及微服务管理全面,并且在高可靠、高可阔以及在应对复杂业务和承受并发的能力上发挥出色,使其受到众…

    技术杂谈 2023年7月25日
    055
  • openpyxl使用总结

    设置表头单元格的颜色 fill = PatternFill("solid", fgColor=’FF000000′) font = Font(color=’00…

    技术杂谈 2023年6月21日
    095
  • 势函数法

    https://www.cnblogs.com/huadongw/p/4106290.html 势函数主要用于确定分类面,其思想来源于物理。 1 势函数法基本思想 假设要划分属于两…

    技术杂谈 2023年5月31日
    0120
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球