fastdfs支持断点续传需要客户进行切片上传,并且切片字节大小小于等于storage配置的buff_size,默认是256k。当fastdfs storage接收客户端上传数据时,如果出现超时的情况会对文件offset和接收时记录的start、end进行比较,当offset>start 并且 offset < end时即写入文件的数据是应接收的一部分数据时,会truncate。所以当切片大小小于buff_size时,每次写入时如果发生异常,因未达到buff_size,所以服务端还未写入文件,不会产生truncate问题。注意发生异常,下次传输时,需根据fileid获取服务端的文件大小,然后对文件流进行skip之后,继续上传即可。

以下是核心代码

/**
* 如果fileid不为空则代表是续传
* @param local_filename
* @param fileid
* @return
*/
public UploadResultInfo upload_file(String local_filename, String fileid) {
StorageClient1 client = null;
try {
client = assignResourse(fileid);
} catch (Exception e) {
return new UploadResultInfo(fileid,local_filename, e.getMessage());
}

try{
// 如果file没有值则代表是新文件上传不是续传
try {
if (fileid == null || fileid.trim().length() == 0) {
String ext_name = fetchFileExtName(local_filename);
fileid = client.upload_appender_file1(new byte[] {}, ext_name,
null);
}
} catch (Exception e) {
return new UploadResultInfo(fileid,local_filename, "上传文件失败");
}

// ------------开始按照文件切片追加文件----------------------
long size = 0;
try {
File file = new File(local_filename);
long length = file.length();
logger.debug("FileService StorageServer:"
+ client.getStorageServer() + ",TrackerServer:"
+ client.getTrackerServer());
FileInfo fileInfo = fetchFileInfo(client,fileid);
size = fileInfo.getFileSize();

logger.debug("FileService StorageServer:"
+ client.getStorageServer() + ",TrackerServer:"
+ client.getTrackerServer());
// 客户端记录已上成功上传到服务端的记录
size = upload_file(client,fileid, size, length, new FileInputStream(file));
//只有当完全上传成功才返回一个完整的UploadResultInfo对象
if(size == length){
UploadResultInfo uploadresultinfo = new UploadResultInfo(fileid,true,local_filename, "上传文件成功",size);
uploadresultinfo.setUrl(ProtoCommon.HTTP.concat(fileInfo.getSourceIpAddr()).concat("/").concat(fileid));
return uploadresultinfo;
}
return new UploadResultInfo(fileid,local_filename, "追加文件失败1",size);
} catch (FileNotFoundException e) {
return new UploadResultInfo(fileid,local_filename, "本地文件未找到,追加失败",size);
} catch (Exception e) {
return new UploadResultInfo(fileid,local_filename, "追加文件失败2",size);
}

}finally {
releaseResourse(client);
}
}

/**

* @param fileid   远程文件标识用于追加
* @param skipsize 已成功上传的文件大小
* @param length   完整文件大小
* @param is       完整文件流
* @return
* @throws Exception
*/
public long upload_file(StorageClient1 client,String fileid, long skipsize, long length,
InputStream is) throws Exception {
if (skipsize >= length) {
return length;
}
byte[] buff = new byte[ClientGlobal.section_size];
is.skip(skipsize);
while (skipsize < length) {
int readcount = is
.read(buff,
0,
(length - skipsize) < buff.length ? (int) (length - skipsize)
: buff.length);
int result = -1;
try {
byte[] newbuffer;
if (readcount < buff.length) {
newbuffer = new byte[readcount];
System.arraycopy(buff, 0, newbuffer, 0, readcount);
result = client.append_file1(fileid, newbuffer);
} else {
result = client.append_file1(fileid, buff);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (result != 0) {
return skipsize;
}
skipsize += readcount;
logger.debug(fileid+"->skipsize:"+skipsize);
}
return length;
}
完整代码下载见http://download.csdn.net/detail/kaka20099527/8833107

fastdfs断点续传相关推荐

  1. FastDFS短域名实现方案、seo优化

    fastdfs 断点续传 目录 概 述 小结 参考资料和推荐阅读 LD is tigger forever,CG are not brothers forever, throw the pot and ...

  2. 孤傲苍狼 的MySQL总结_孤傲苍狼

    文件上传到文件服务器底层封装 fastdfs-zyc(fastdfs监控管理工具) 分布式文件系统FastDFS设计原理 FastDFS fastdfs-client-java 分布式文件系统 Fas ...

  3. fastdfs redis java,大文件上传_断点续传_文件分片传输_fastdfs_前后端一站式解决方案...

    大文件上传,断点续传,秒传,fastdfs 项目介绍 实现h5与fastdfs之间的断点续传,大文件上传,秒传 软件架构 软件架构说明 webuploader+springboot+redis+fas ...

  4. FastDFS 设计理念、文件上传、下载、同步、删除和断点续传原理

    一.FastDFS 系统架构和功能原理 1.架构详解 storage server:存储服务器(又称存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上.Storage s ...

  5. 高可用高性能分布式文件系统FastDFS实践Java程序

    在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...

  6. FastDFS学习笔记

    FastDFS课程内容 第一部分:FastDFS基础回顾 为什么要有分布式文件系统.分布式文件系统对比.FastDFS特性.linux安装.java访问FastDFS 第二部分:FastDFS系统架构 ...

  7. FastDFS的介绍

    FastDFS的介绍 FastDFS FastDFS是由国人余庆所开发,其项目地址: https://github.com/happyfish100FastDFS是一个轻量级的开源分布式文件系统,主要 ...

  8. 实现企业级分布式储存之mogilefs和fastdfs的应用

    一.实现企业级分布式存储之mogilefs的应用. (1)关于mogilefs Web 2.0 时代的到来,使得单个计算机节点远远无法满足用户对海量数据和应用程序运行空间的需求.个人和企业都有安全而持 ...

  9. FastDFS特性及问题思考

    FastDFS是国人开发的一款分布式文件系统,目前社区比较活跃.系统中存在三种节点:Client.Tracker.Storage,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage ...

  10. FastDFS构成、特性、Linux下安装以及Java如何访问

    一.FastDFS 基础概念 1.为什么要有分布式文件系统 单机时代 优点:文件访问比较便利,项目直接引用,实现起来简单,无需任何复杂技术,保存文件和访问文件都 很方便. 缺点:一方面,文件和代码耦合 ...

最新文章

  1. C语言博客作业--字符数组
  2. Linux掛載samba
  3. 东华大学计算机学院讲座单,计信学院成功举办2018级专业导师面对面系列讲座活动...
  4. ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5
  5. php tp写构造函数,详细介绍ThinkPHP中类的构造函数_construct()与_initialize()的区别
  6. 什么命令能把Linux搞死机,Linux常见死机原因
  7. Unity2018新功能抢鲜 | C# Job System Ⅱ
  8. Spread for Windows Forms高级主题(6)---数据绑定管理
  9. 黑进iPhone让手机崩溃重启,只需15行代码:iOS漏洞你可知?
  10. Python redis 批量模糊删除keys
  11. 算法-满足条件的数字放在新数组
  12. CentOS-6.4 安装 Memcached
  13. 转载:iOS 8 自适应 Cell
  14. 视频直播、视频会议、视频点播三者有何区别
  15. Maven-Eclipse使用maven创建HelloWorld Java项目
  16. dex2jar 和 jd-gui 的安装与使用
  17. ASCII码、Unicode和UTF-8之间的转换
  18. Deepin - 磁盘清理工具Bleachbit
  19. ES数据的操作(二)
  20. 7-38 数列求和-给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

热门文章

  1. dex文件格式------map_list解析
  2. php saas,saas系统是什么
  3. vue-sytle样式抽离
  4. 5393: YuYu的密码II
  5. 20亿人欢庆开斋节,出口企业该如何把握Q2爆单潮
  6. LinuxTerminal_HotKey
  7. ghostscript9.26交叉编译
  8. 音视频封装格式:FLV
  9. 创可贴的 ROS PX4 自主飞行无人机 学习笔记(3)
  10. Idea 文件定位图标显示与关闭 -- idea ver:2020.1