spring大文件分块上传原理解析

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

  • 500M以下的用http协议传输(网上一搜大把的)
  • 500M以上1G以下的用http协议分块或者ftp协议传输
  • 1G以上的只能用ftp协议传输

第一种很简单,博主在这里就不谈了。
第二种是博主最近几天一直在考虑的。谁知昨天天无意中看到了原同事(大神级别)博客的一篇文章,算是大致明白了http协议分块传输原理。要想分块要解决下面几个问题:

1已上传的文件怎么唯一标识,然后不用再次上传
2.前端怎么分块
3.后端怎么接受分块,组装多个分块

一、取文件的md5值,上传后把md5存数据库;再次上传时获取前端传来的md5到数据库中查询,如果已存在,则不用再次上传

二、关于前端分块,请参考http://fex-team.github.io/webuploader/

三、后端接受分块

1.每当一个分块到来,后端根据其带的md5在服务器创建一个同名的文件夹,并根据块的索引,创建同名的文件(0,1,2...),并用spring mvc上传到服务器。
2.当所有的分块都传完后,前端像后端发送合并的请求,那么问题来了,怎么合并呢?
答案就是:FileChannel
下面上干货

FileChannel outChannel = new FileOutputStream(outputFile).getChannel();

                //合并
                FileChannel inChannel;
                for(File file : files){
                    inChannel = new FileInputStream(file).getChannel();
                    inChannel.transferTo(0, inChannel.size(), outChannel);
                    inChannel.close();

                    //删除分片
                    if(!file.delete()){
                        log.error("分片[" + folder + "=>" + file.getName() + "]删除失败");
                    }
                }
                outChannel.close();

关于ftp上传,也是博主下一步考虑的事情,敬请期待。

第二弹,请看下面
http://blog.csdn.net/haohao123nana/article/details/54692669

项目下载地址: http://download.csdn.net/download/haohao123nana/10015607

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haohao123nana

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值