fastdfs断点续传

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

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: FastDFS是一个开源的轻量级分布式文件系统,用于分布式存储和管理大规模的文件。在使用FastDFS进行断点续传下载时,可以结合Java语言来实现。 在Java中,首先需要引入FastDFS的相关依赖库,比如fastdfs-client-java。然后,通过FastDFS的Java API来实现断点续传下载的功能。 具体实现步骤如下: 1. 首先,需要获取待下载文件的文件元数据,如文件名、文件大小等信息,可以通过FastDFS的API来获取。 2. 然后,根据文件元数据和下载路径,创建一个本地文件,用于存储下载的文件内容。 3. 接着,通过FastDFS的API,通过指定的文件偏移量和下载长度来读取文件内容,将文件内容写入到本地文件中。同时,记录已下载的文件长度。 4. 当下载完成时,关闭与FastDFS的连接,并完成断点续传下载的过程。 需要注意的是,在断点续传下载前,需要判断是否已有部分文件已经下载完成,如果是,则可以根据已有的文件长度来设置文件偏移量和下载长度,从而进行断点续传下载。 总而言之,Java可以通过调用FastDFS的API来实现断点续传下载功能,具体的实现步骤包括获取文件元数据、创建本地文件、通过指定的偏移量和长度读取文件内容,并将内容写入到本地文件中,最后完成断点续传下载过程。 ### 回答2: FastDFS是一个开源的轻量级分布式文件系统,它主要用于解决大规模数据存储和分布式文件访问的问题。FastDFS完整的文件传输过程可以分为文件上传和文件下载两部分。而断点续传则是指在网络异常或用户主动中断的情况下,能够恢复之前未传输完成的文件传输。 在Java中实现FastDFS断点续传下载可以通过以下步骤: 1. 首先,通过FastDFS提供的Java客户端API,连接到FastDFS服务器。 2. 检查本地文件系统,判断是否存在已下载的临时文件。 3. 如果存在未下载完成的临时文件,获取已下载字节数并记录。 4. 通过FastDFS的文件下载API,设置偏移量为已下载的字节数。 5. 将下载的文件片段追加到本地临时文件中,并更新已下载的字节数。 6. 重复步骤4和步骤5,直到下载完成。 7. 删除临时文件并保存完整的文件。 在每次下载时,需要记录已下载的字节数,以便下次下载时可以根据该偏移量进行断点续传。可以将该信息保存在本地文件系统的临时文件中,或者通过数据库等方式进行持久化存储。 断点续传的实现可以大大提高文件传输的可靠性和效率,特别是在网络不稳定或文件较大的情况下。通过合理地记录已下载的字节数,并使下载从中断处继续,可以减少重复传输的数据,节省带宽和时间。 总之,使用Java可以通过FastDFS的API实现断点续传下载。这样可以提高文件传输的可靠性和效率,为用户提供更良好的体验。 ### 回答3: FastDFS是一个分布式文件存储系统,它采用了文件切割、分布式存储和文件索引等技术,可以高效地存储和管理大规模的文件。在Java中,可以使用FastDFS提供的客户端API来实现断点续传下载功能。 在实现断点续传下载的过程中,首先需要通过FastDFS客户端API获取文件的元数据信息,包括文件大小和分片信息等。然后,根据已下载的文件大小,确定接下来要从哪个分片开始下载。 接下来,使用Java的IO流技术将分片数据写入本地文件中。为了实现断点续传功能,可以通过设置HTTP请求的Range头字段来指定下载的起始位置,从而避免重复下载已经下载过的部分。 在下载过程中,可以采用多线程的方式进行并发下载,提高下载速度。可以将文件分成多个连续的范围,并为每个范围创建一个线程进行下载。在每个线程下载完成后,将下载的数据写入本地文件中相应的位置。 另外,在断点续传下载的过程中,需要实时记录已下载的文件大小,并及时保存断点信息。这样,当下载中断时,下次继续下载时可以根据已下载的文件大小和分片信息来确定需要继续下载的位置,从而实现断点续传的功能。 总之,通过使用FastDFS的客户端API和Java的IO流技术,可以实现断点续传下载功能。通过合理地划分分片和利用多线程进行并发下载,可以提高下载速度。并通过记录已下载的文件大小和断点信息,实现下载中断后的断点续传
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值