这两天关于大文件上传这个问题搞得很是头疼,昨天下班回去调研了下,对于不同大小的文件对应有几种解决办法:

l   500M以下的用http协议传输(网上一搜大把的),比如Flash,Plupload,WebUploader,SilverUpload,swfupload等,这些都是用Flash或者Silverlight(微软已放弃的技术)来实现的。

l   500M以上1G以下的用http协议分块。如HTML5(不支持低版本浏览器,且比较消耗系统资源)

l   1G~10G以上的使用HttpUploader6传输。QQ邮箱,百度其它网盘均采用了控件技术来实现,与HTML5和Flash技术相比控件技术在稳定性可扩展性方面都有巨大优势。

l   100G~1T以上的使用HttpUploader7传输。这个属于特殊行业需求,不过部分行业也确实需要,而且成熟的解决方案也不多。

第一种很简单,博主在这里就不谈了。

第二种网上也比较多,不过可惜的是资料都非常凌乱,没有统一的规范,都是东一榔头西一棒子的,让人看的头晕。不是缺文件就是缺图片,不是缺数据库就是缺代码。弄一个完整的项目真心很不容易。

1已上传的文件怎么唯一标识,然后不用再次上传

2.前端怎么分块

3.后端怎么接受分块,组装多个分块

一、取文件的md5值,上传后把md5存数据库;再次上传时获取前端传来的md5到数据库中查询,如果已存在,则不用再次上传。在HttpUploader6也已经封装好了,不需要你再做任何处理。

二、关于前端分块,HttpUploader6这个控件已经做好了,不需要开发人员再做其它的处理,直接使用就行了。

三、后端接受分块

在up6这个项目中有一个f_post.jsp页面,用来接收分块数据。

代码如下:

说明:它的代码是JSP页面的,只需要修改一下就可以直接用在spring中

String uid          = request.getHeader("uid");//

String id           = request.getHeader("id");

String md5          = request.getHeader("md5");

String lenSvr       = request.getHeader("lenSvr");

String lenLoc       = request.getHeader("lenLoc");

String blockOffset  = request.getHeader("blockOffset");

String blockSize    = request.getHeader("blockSize");

String blockIndex   = request.getHeader("blockIndex");

String complete     = request.getHeader("complete");

String pathSvr      = request.getHeader("pathSvr");

pathSvr = PathTool.url_decode(pathSvr);

//参数为空

if( StringUtils.isBlank( uid )

|| StringUtils.isBlank( id )

|| StringUtils.isBlank( blockOffset )

|| StringUtils.isBlank(pathSvr))

{

XDebug.Output("param is null");

return;

}

// Check that we have a file upload request

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(Integer.parseInt(blockSize) == rangeFile.getSize())

{

//保存文件块数据

FileBlockWriter res = new FileBlockWriter();

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

rangeFile.delete();

out.write("ok");

}

else

{

rangeFile.delete();

out.write("block size error");

}%>

项目下载地址:

http://download.csdn.net/download/activexme/10214556

http://www.ncmem.com/download/up6.3/jsp/Uploader6.3Oracle.rar

https://pan.baidu.com/s/1dGYV83n

https://pan.baidu.com/s/1kWjYyN1

https://pan.baidu.com/s/1bqADhl9

spring大文件分块上传原理解析2相关推荐

  1. c#实现浏览器端大文件分块上传

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  2. Django大文件分块上传和分块下载

    下面是简单的demo,可能有Bug,需要的看官拿去自己拓展吧. views.py #!/usr/bin/env python # -*- coding: utf-8 -*- import os imp ...

  3. Akka实战:HTTP大文件断点上传、下载,秒传

    2019独角兽企业重金招聘Python工程师标准>>> 访问:https://github.com/yangbajing/scala-applications/tree/master ...

  4. 请问:怎么实现大文件快速上传?

    关注公众号 前端开发博客,领27本电子书 回复加群,自助秒进前端群 前言 大文件快速上传的方案,相信你也有过了解,其实无非就是将 文件变小,也就是通过 压缩文件资源 或者 文件资源分块 后再上传. 本 ...

  5. Springboot + Vue实现大文件切片上传

    Springboot + Vue实现大文件切片上传 大文件切片上传原理就是将一个大文件分成若干份大小相等的块文件,等所有块上传成功后,再将文件进行合并. 一.Springboot后端 1.实体TChu ...

  6. Vue实现大文件分片上传,包括断点续传以及上传进度条

    首先解释一下什么是分片上传 分片上传就是把一个大的文件分成若干块,一块一块的传输.这样做的好处可以减少重新上传的开销.比如:如果我们上传的文件是一个很大的文件,那么上传的时间应该会比较久,再加上网络不 ...

  7. Java实现腾讯云COS高级(大文件)上传,不考虑分块

    // 腾讯云COS高级(大文件)上传,不用考虑分块public static URL fileCOS(File file, String key) throws Exception {String S ...

  8. vue大文件分片上传插件

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  9. java 分块上传_Java 文件分块上传客户端和服务器端源代码

    本博客介绍如何进行文件的分块上传.本文侧重介绍客户端,服务器端请参考博客<Java 文件分块上传服务器端源代码>.建议读者朋友在阅读本文代码前先了解一下 MIME 协议. 所谓分块上传并非 ...

最新文章

  1. 升压转换器 (Boost)
  2. python 数组组合_python-查找数组中某些元素的所有组合
  3. quartus管脚分配后需要保存吗_掉电保存数据到EEPROM
  4. 不生效 设置了viewport_配置viewport
  5. 循环序列模型 —— 1.6 语言模型和序列生成
  6. MySQL 5.5 手册下载
  7. WORD如何生成两个目录?
  8. 【IDEA】Error:java: Compilation failed: internal java compiler error
  9. java参数传递的乱码问题
  10. hdu 1718 Rank
  11. Python中各种括号的区别、用途及使用方法
  12. 3.2亿人每天都在刷抖音,而他们却看这几个公众号!
  13. 函数式编程基础---高阶函数和偏函数
  14. ant design-Table中的分页实现(包括点击跳页,输入跳页,以及指定每页项目数)
  15. Topaz Gigapixel AI打开软件闪退及加载图片闪退 解决办法
  16. 算法工程师面试基础题目及答案
  17. PyQt5之Drag拖曳功能
  18. java get_JAVA 中get()和get()的用法,和意义?
  19. Openstack的安装部署教程
  20. Maven 常用镜像站地址

热门文章

  1. 我未成名君未嫁,可能俱是不如人?
  2. Conda创建新环境
  3. proteus时钟电路仿真
  4. Sublime字体Mactype渲染
  5. OFPS终章 毁灭吧世界我累了
  6. 深度linux u盘启动安装教程,国产系统Deepin Linux U盘安装教程,支持一下!
  7. @Transactional类内部访问失效原因详解
  8. linux 7 tmpfs,技术|如何在RHEL/CentOS 7.0中使用tmpfs
  9. DH算法、DHE算法、ECDHE算法演进
  10. 修改SharePoint网站的最大上载大小