Flash 断点续传 源文件下载
上一篇日志中给出了一些演示视频,这次释出代码。
AS代码是在一个星期内挤空闲时间写出来的,BUG还是有不少的。呵呵。
后台C#是边学边写的。
结构上经历过几次变动,由原来的单线上传变多线上传。
在显示上传进度上也花费了些时间。用于标志上传状态的MovieClip达到两千以后,
即使什么不做CPU也到了30%,于是对这部分优化,改成了位图显示。
多线上传方面,5线上传还是比较占用资源的,
因为文件的写入是独占式的,不可能真正的达到并发写入,
时间浪费在了请求资源这里,所以多线和单线没太大区别。
速度方面(XP的IIS5.1):
目前上传数据块大小是定值,未做成自动调节的,对速度的影响比较大。
设置为10KB,速度能稳定在600KB
设置为100KB时,可达到2MB
设置到1M时,峰值能到21MB
以上均为本地测试。
先天不足就是前文提到的要把文件先加载到内存中再上传,
再有就是使用过小的分块,会频繁的提交请求,会加大服务器的负担。
代码在这里下载:
http://code.google.com/p/kuploader/downloads/list
前后台之间的数据块通讯规则比较简单,这里只提供了一个方法抛砖引玉,呵呵。
欢迎大家拍砖。

您好!今天向您的邮箱发送了一封请教的邮件,希望大哥您查收.主要是关于服务器端接受文件大于100K时,报文件句柄无效 的异常.期待您的回复.小弟万分感谢.
[Reply]
非常好,我也想研究研究,可是今天花了一天时间,还不是很明白;我的后台是JAVA;我跟踪测试了哈,怎么LocalFSOManager类里面的setFile(name:String, value:LocalFSO)方法一直没有执行;想特意请教您.
不知道您的邮箱号,也无法发邮件给你;所以留下小弟的QQ号,希望得到您的指教.
QQ:345910534
[reply=auzn,2009-10-22 09:02 AM]我的邮箱:auzn1982#gmail.com
SharedObject没有执行, 是否是禁用了本地存储呢?[/reply]
[Reply]
楼主,我很需要你的帮助,望能加我的QQ,当面请教您一些问题。
[/reply]
QQ:78600403,备注:FLASH
[reply=auzn,2009-09-08 06:45 PM]好, 给我写信吧. QQ基本不用作和大家交流的
[Reply]
请问你说的多线程可以单文件多线程上传吗?并发多个上传进程
[reply=auzn,2009-06-29 03:41 PM]嘿嘿,这不是严格意义上的多线程,形似神似而已
如果Flash中URLLoader是使用多线程上传加载文件的,那样和多线程还贴点边儿
不过后台可以多线接收吧, 文件不是顺序写入的, 数据块中包含了文件块位置及文件块长度
[/reply]
[Reply]
还有最重要的一个问题就是选择大文件上传时,比如300M,浏览器会报错:RunTime Error的错,然后就关闭,firefox是直接重起,这个这样解决哦?没找到办法
[reply=auzn,2009-06-22 10:33 AM]好的.这个我会找个时间测试一下
最近十天不能上网,没有及时回复请见谅[/reply]
[Reply]
非常感谢auzn的耐心指导,[smile],前边的问题都基本解决了,不过还有几个问题:
1,就是怎样把文件的一些参数传到后台去?比如是上传者,文件说明等等,我现在后台改成了servlet了.
2:就是感觉传了文件如果不关浏览器的话,加载到flash的文件,内存没有释放,可不可以传完就释放哦?
3:这个可以作成批量上传吗?
[Reply]
单个线程 好办,但是多个线程的就不知道怎么算百分比了…………[sad]
[/reply]
[reply=auzn,2009-06-08 05:19 PM]也有办法,可以在主程序中加个计数器: var counter:uint = 0;
然后每调用一次partCompleteHandler事件处理方法,counter就自加,
然后再Math.floor(counter/总块数*100)
[Reply]
看了半天还是没把上传进度的百分比整出来,楼主能把这个代码加上吗? 非常感谢!!
[/reply]
[reply=auzn,2009-06-08 08:43 AM]最近可能还不行,找不到时间
主要修改还是在partCompleteHandler方法加入: Math.floor(当前块号码/总块数*100),可以尝试下
[Reply]
怎么没看到哦,你代码里只有显示个速度,,我是想用FLEX自带的进度条,横条的,不知道怎样加上去.
楼主这么厉害,可以把这个转成FLEX的吗?你这个是actionscript的,不好改界面呢
[reply=auzn,2009-06-05 03:15 PM]嗯.那些小方块就是用于显示进度的.你可以根据块数来做进度显示
主程序中有个partCompleteHandler方法.
这个在FLEX里面也是可用的.
要做些修改,主要是显示UI等控件,上传类不用修改[/reply]
[Reply]
怎样添加 进度条和上传的百分比,还有剩余时间哦?怎样添加 进度条和上传的百分比,还有剩余时间哦?
[/reply]
[reply=auzn,2009-06-05 12:39 AM]示例里面已经集成了 看代码吧
[Reply]
不错。下了也顶个[GoodLuck]
[reply=auzn,2009-04-12 01:55 AM]:)[/reply]
[Reply]
师兄,我现在也想实现flash断点上传,但看了半天你的思路我还是有疑问哈,你是一次性把分块好文件传到后台处理,还是,一块一块的传到后台处理啊,如果是一块一块的传到后台处理,频繁的请求后台,会不会有问题,,,,你的那个是怎么实现的,你的代码我还在研究中,但有很多看不明白哈,我的QQ:547574829,希望能与你交流哈,我是flash新手。
[reply=auzn,2009-04-12 01:55 AM]嗯,分块上传的,上文中也谈及了这个问题了,呵呵[/reply]
[Reply]
楼主好厉害啊。不过好像不是FTP上传。
[reply=auzn,2009-03-19 08:33 AM]这个不是FTP上传 :)[/reply]
[Reply]
请问你的文件断点信息(比如文件分几个块,每个块多大,每个块下载了多少),记录在哪儿的呢?
下一次继续上传,从哪儿读取这些断点信息呢?
[reply=auzn,2009-01-16 01:48 AM]选择文件后,先检查本地的SO中存的MD5信息是否和选择文件相同的,如果有相同数据,再判断是否已经上传成功,如果没有完成,会询问是否续传,如果选择是,那么就将文件的信息发送给后台,后台根据文件信息判断是否存在此文件,并根据文件信息返回需要续传的块序号,然后FLASH根据这些序号上传。
上传时,后台接收成功一个块,就会在日志文件写入相应的块信息,便于下次查询
如果上传成功,则将日志信息删除,本地SO中更新上传状态
大概就这个思路吧,逻辑上还不算严谨。[/reply]
[reply=auzn,2009-01-16 01:51 AM]当序号数组上传完毕后,会向后台发送校验请求,后台核对日志文件,如果有未上传的块,再次返回给FLASH重新上传,否则此次文件上传完成。
[/reply]
[Reply]
做得不错, 可以尝试多写点,比如注释阿~文档阿~例子呀 专业些,顶!
[/reply]
[reply=auzn,2009-01-11 12:17 AM]呵呵,谢谢你的建议
[Reply]
嘿嘿,试试
[/reply]
[reply=auzn,2008-12-23 08:51 AM]试试
[Reply]
感谢分享~~~
[reply=auzn,2008-12-23 08:51 AM]呵呵[/reply]
[Reply]
支持楼主!
太有才了![razz]
[reply=auzn,2008-12-19 03:43 PM]欢迎试用哈[/reply]
[Reply]