fastdfs支持断点上传
来源:互联网 发布:蓝光原盘播放器软件 编辑:程序博客网 时间:2024/06/05 04:37
文章来源:http://blog.csdn.net/kaka20099527/article/details/46608013
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支持断点上传
- C# Ftp 源代码(支持断点上传,断点下载)
- HttpUrlconnection 实现大文件分片断点上传,支持Https
- fastdfs支持缩略图
- FastDFS的PHP支持
- FastDFS上传文件实例
- FastDFS上传简单Demo
- ajax上传图片+FastDFS
- 图片上传服务器fastDFS
- FastDFS上传小结
- 给FastDFS安装nginx支持
- 使用comment.net的FTP工具后支持完美的断点上传和下载
- 支持断点上传文件的演示(C#)有图、有源码
- 服务器端支持 断点下载
- 学习FastDFS上传与下载
- fastdfs 上传大小限制调整
- 如何使用FastDFS上传图片
- fastdfs文件上传和下载
- 特征工程整理流程和涉及技术点
- 用通俗的话说明docker是什么
- win10、win8和win7下解决php5.3和5.4、5.5等不能加载php_curl.dll的终极解决
- c++移位运算
- tomcat环境变量配置和把tomcat集成到eclipse不是一回事
- fastdfs支持断点上传
- spark 2.1 RDDCheckpointData and ReliableRDDCheckpointData
- Eclipse neon(4.6)安装tomcat plugin
- 图的基本操作:建立图,DFS,BFS-06-图1 列出连通集
- java中判断字符串是否为数字的方法的几种方法
- jquery文件上传控件 WebUploader
- (三) Spring Cloud
- jsp过大时编译失败的解决方法
- php 字符串转日期格式