如何通过 Web Service 断点续上传或下载文件
目录
1. 描述 .....................................................................................................................................................................2
. Web Service ....................................................................................................................................................2
. 断点续传 .........................................................................................................................................................2
2. WEB Service 开发 .............................................................................................................................................2
. 不支持断点续传方法 .....................................................................................................................................2
. 支持断点续传方法 .........................................................................................................................................2
. 不支持断点下载方法 .....................................................................................................................................2
. 支持断点下载方法 .........................................................................................................................................2
3. 上传、下载工具开发 .........................................................................................................................................3
. 文件上传工具 .................................................................................................................................................3
. 文件下载工具 .................................................................................................................................................3
1. 描述
. Web Service
Web Service 是一个平台独立的,低耦合的,自包含的、基于可编程的 web 的应用程序,可使用开放
的 XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于
开发分布式的互操作的应用程序。
Web Service 技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,
就可相互交换数据或集成。依据 Web Service 规范实施的应用之间, 无论它们所使用的语言、 平台或内
部协议是什么, 都可以相互交换数据。Web Service 是自描述、 自包含的可用网络模块, 可以执行具体
的业务功能。Web Service 也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如
标准通用标记语言下的子集 XML、HTTP。Web Service 减少了应用接口的花费。Web Service 为整个企业
甚至多个组织之间的业务流程的集成提供了一个通用机制。
Web Service 在此不做过多介绍,详细介绍请百度或搜索相关资料。
. 断点续传
客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划
分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的
部分开始继续上传下载以后未上传下载的部分,而没有必要重头开始上传下载。用途可以节省时间,提高
速度。
有时用户上传下载文件需要历时数小时,万一线路中断,不具备断点续传的服务器或下载软件就只能
从头重传;比较好的服务器或下载软件具有断点续传能力,允许用户从上传下载断线的地方继续传动,这
样大大减少了用户的烦恼。
常见的支持断点续传的上传、下载软件:超级旋风、迅雷、web 迅雷、影音传送带、快车、BitComet、
电驴 eMule、哇嘎 Vagaa 等。
2. WEB Service 开发
要想实现断点续传或下载文件,Web Service 需要支持上传文件的部分内容,或下载文件的部分内容。
本人采用上传或下载字节的方式进行 Web Service 方法开发。
. 不支持断点续传方法
不支持断点续传方法,即客户端,将文件所有字节内容上传到服务器。由于网络中断,或网络异常导
致上传失败时,需要重新上传。如果是比较大的文件,比如超过 4MB( Web 应用程序默认一般支
持上传 4MB 大小文件),重传将浪费时间及给使用者带来不好的体验。
. 支持断点续传方法
支持断点续传方法,方法将提供文件内容开始位置参数,然后将上传过来的文件内容,根据文件起始
位置写入文件中。
. 不支持断点下载方法
不支持断点下载,方法提供下载文件名称,文件比较大时(大于 4MB),将不进行下载。网络中断时,
需要重新进行下载。
. 支持断点下载方法
支持断点下载,方法除提供下载文件名称参数外,还提供下载文件起始位置及下载文件大小(方法控
制每次最大下载 100KB)。为了实现断点下载,同时提供下载文件信息(文件大小)方法,以便客户端知
道需要下载多大文件,分多少次进行下载。
获取文件信息方法:
下载文件内容方法:
3. 上传、下载工具开发
文件上传,本文档不作介绍,有需要可百度搜索,如何通过 Web Service 上传大文件方法。本文着重
介绍如何实现断点下载工具开发,断点上传文件,可参考实现。
. 文件下载工具
工具使用 VS2008 C# 语言开发 Winform 应用程序。文件下载工具界面设计,界面简单设计为下载文
件目录、下载文件名称及保存文件目录。下载文件目录,在实际项目开发可能就是某个客户的客户账号,
根据客户账号读取服务器文件,进行下载。
. 断点下载
本人设计-下载帮助类(SQFileDownload),记录下载文件信息及每次下载进度。出现网络中断,打开
工具重新下载时,读取下载信息进行下载。
初始文件下载,读取已下载文件信息。
未下载过,进行直接下载。
已下载过,根据下载进度,进行下载。
主界面调用。
至此,整个如何通过 Web Service 断点续传及下载文件,介绍、分享完毕,实现方法只做参考。附录
资料:
Ehcache 缓存配置
简介
Cache 的配置很灵活,官方提供的 Cache 配置方式有好几种。你可以通过声明配
置、在 xml 中配置、在程序里配置或者调用构造方法时传入不同的参数。
你可以将 Cache 的配置从代码中剥离出来,也可以在使用运行时配置,所谓的
运行时配置无非也就是在代码中配置。以下是运行时配置的好处:
· 在同一个地方配置所有的 Cache,这样很容易管理 Cache 的内存和磁盘消耗。
· 发布时可更改 Cache 配置。
· 可再安装阶段就检查出配置错误信息,而避免了运行时错误。
本文将会对 配置文件进行详细的阐述。在配置的时可以拷贝一个现
有的 ,如果没有请点击这里去下载。
如果你调用了 CacheManager 默认构造方法去创建 CacheManager 的实例,此方
法会到 classpath 中找 文件,否则它会到类路径下找
文件。而 被包含在 jar 包中,所有它肯定
能找的到。
提供了一个非常简单的默认配置,这样可以使用户在没有创
建 的情况下使用 Ehcache。
不过这样做 Ehcache 会提醒用户创建一个正确的 Ehcache 配置。
片段:
<ehcache>
<diskStore path=""/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
和其他配置文件
在 之前的版本,只支持 ASCII 编码的 配置文件。在
之后版本中,支持 UTF8 编码的 配置文件。因为向后兼
容,所有采用 ASCII 编码的配置文件完全没有必要转换为 UTF8。
一个 CacheManager 必须要有一个 XML 配置。由于磁盘路径或是监听端口,多
个 CacheManager 使用同一个配置文件时会出现错误。
下面是 具体实例以及配置指南
<ehcache xmlns:xsi=
· CacheManager 配置
DmulticastGroupPort=4446,这样可以配置监听端口。
· DiskStore 配置
如果你使用的 DiskStore(磁盘缓存),你必须要配置 DiskStore 配置项。如果不
配置,Ehcache 将会使用 。
diskStroe 的“path”属性是用来配置磁盘缓存使用的物理路径的,Ehcache 磁盘缓
存使用的文件后缀名是.data 和.index。
<disStore path=””/>
· CacheManagerEventListener 配置
我们通过 CacheManagerEventListenerFactory 可以实例化一个
CacheManagerPeerProvider,当我们从 CacheManager 中 added 和 removed Cache
时,将通知 CacheManagerPeerProvider,这样一来,我们就可以很方面的对
CacheManager 中的 Cache 做一些统计。
注册到 CacheManager 的事件监听类名有: adding a Cache 和 removing a Cache
<cacheManagerEventListenerFacotory class=”” properties=””/>
· CacheManagerPeerProvider 配置
在集群中 CacheManager 配置 CacheManagerPeerProviderFactory 创建
CacheManagerPeerProvider。具体的实例如下:
<cacheManagerPeerProviderFactoryclass=".
RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1|
//server1:40000/sampleCache2|//server2:40000/sampleCache2"
propertySeparator="," />
· CacheManagerPeerListener 配置
CacheManagerPeerListener 配置是用来监听集群中缓存消息的分发的。
<cacheManagerPeerListenerFactory
class=""
properties="hostName=fully_qualified_hostname_or_ip,
port=40001,
socketTimeoutMillis=120000"
propertySeparator="," />
· Cache 配置
· name:Cache 的唯一标识
· maxElementsInMemory:内存中最大缓存对象数。
· maxElementsOnDisk:磁盘中最大缓存对象数,若是 0 表示无穷大。
· eternal:Element 是否永久有效,一但设置了,timeout 将不起作用。
· overflowToDisk:配置此属性,当内存中 Element 数量达到
maxElementsInMemory 时,Ehcache 将会 Element 写到磁盘中。
· timeToIdleSeconds:设置 Element 在失效前的允许闲置时间。仅当 element
不是永久有效时使用,可选属性,默认值是 0,也就是可闲置时间无穷大。
· timeToLiveSeconds:设置 Element 在失效前允许存活时间。最大时间介于
创建时间和失效时间之间。仅当 element 不是永久有效时使用,默认是 0.,也就
是 element 存活时间无穷大。
· diskPersistent:是否缓存虚拟机重启期数据。(这个虚拟机是指什么虚拟
机一直没看明白是什么,有高人还希望能指点一二)。
· diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是
120 秒。
· diskSpoolBufferSizeMB:这个参数设置 DiskStore(磁盘缓存)的缓存区
大小。默认是 30MB。每个 Cache 都应该有自己的一个缓冲区。
· memoryStoreEvictionPolicy:当达到 maxElementsInMemory 限制时,
Ehcache 将会根据指定的策略去清理内存。默认策略是 LRU(最近最少使用)。
你可以设置为 FIFO(先进先出)或是 LFU(较少使用)。这里比较遗憾,
Ehcache 并没有提供一个用户定制策略的接口,仅仅支持三种指定策略,感觉做
的不够理想。
· Cache Exception Handling 配置
<cacheExceptionHandlerFactory
class="" propertie
s="logLevel=FINE"/>
总结
这里只对通用缓存的配置做了详细的阐述,至于 RMI 缓存和集群缓存可以参考
这里。
下面给出几个配置示例:
· Ehcache 默认 Cache 配置
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskSpoolBufferSizeMB="30"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
· SampleCache1 配置
简单配置,在 文件中有此配置,在使用 Ehcache 前最好将其删除掉,
自己配置。
缓存名 sampleCache1,内存中最多可缓存 10000 个 Element,其中的 element 会
在闲置 5 分钟或是存活 10 分钟之后失效。
超过 10000element 时,element 将会输出到磁盘中,输出路径是 。
<cache name="sampleCache1"
maxElementsInMemory="10000"
maxElementsOnDisk="1000"
eternal="false"
overflowToDisk="true"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
/>
· SampleCache2 配置
Cache 名为 SampleCache2,内存中最多可以缓存 1000 个 element,超出 1000 不
能输出到磁盘中。缓存是永久有效的。
<cache name="sampleCache2"
maxElementsInMemory="1000"
eternal="true"
overflowToDisk="false"
memoryStoreEvictionPolicy="FIFO"
/>
· SampleCache3 配置
Cache 名为 SampleCache3。可缓存到磁盘。磁盘缓存将会缓存虚拟机重启期的
数据。磁盘缓存失效线程运行间隔时间是 10 分钟。
<cache name="sampleCache3"
maxElementsInMemory="500"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="1"
memoryStoreEvictionPolicy="LFU"
/>
· sampleDistributedCache1 配置
Cache 名为 sampleDistributedCache1。
<cache name="sampleDistributedCache1"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class=""/>
<bootstrapCacheLoaderFactory
class=""/>
</cache>
· sampleDistributedCache2 配置
<cache name="sampleDistributedCache2"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class=""
properties="replicateAsynchronously=false, replicatePuts=false,
replicateUpdates=true, replicateUpdatesViaCopy=true,
replicateRemovals=false"/>
</cache>
· sampleDistributedCache3 配置
<!--
Sample distributed cache named sampleDistributedCache3.
This cache replicates using defaults except that the asynchronous replication
interval is set to 200ms.
-->
<cache name="sampleDistributedCache3"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class=""
properties="asynchronousReplicationIntervalMillis=200"/>
</cache>