没有大小限制的文件上传下载代码,其实也不能完全这样讲,毕竟传输文件与网络协议以及文件系统有关系。如果不考虑这些,只看代码的实现,它确实是个好办法。以上传为例,基本思路是,分段传输数据到文件,每次传输时,告知文件名或标识、文件起始偏移、数据块即可。这样做,似乎还能够实现多线程同时传输数据,也许会有一些麻烦,存储竞争文件的写入锁问题。
像我们常用的文件下载工具,通常包含一个原文件同名的空白文件或者与原文件同名同大小的随机数据文件,与一个下载配置文件。这样实现有两种好处。其一,防止文件名被其他进程占用;其二,如果同时给定了文件大小,那么,在尝试创建此文件时是先占用掉磁盘空间的,同时也可以捕获IO异常,比如,可访问异常、权限异常、空间不足异常等等。
当然,作为一个简单的实现,下面代码会判断磁盘可用空间的大小,才会进行下载。
还有一个需要考虑的,下载文件与Windows资源管理器的冲突。这个是我意外发现,比如一个扩展名为.mpg的视频文件,当我们使用Windows定位在这个文件夹时,Windows资源管理器进程会在我们释放文件锁时立即占用,读取该视频文件的缩略图、视频长度、等其他流信息。那么,在我们下一段数据传输来时,需要重新打开文件,自然会出现“文件被其他进程占用”的异常。因此,未传输完成的文件的扩展名建议使用一个未知名称或者.tmp,Windows资源管理器进程(explorer.exe)就不会抢占文件了。
获得磁盘可用空间大小的代码:
上传文件的演示代码,客户端需要多次调用此操作:
下载文件代码,客户端需要多次调用此操作:
那么客户端配合上传文件的参考代码:
配合下载文件的参考代码: