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
前后台之间的数据块通讯规则比较简单,这里只提供了一个方法抛砖引玉,呵呵。
欢迎大家拍砖。

You actually make it appear really easy together with your presentation however I find this topic to be really something that I believe I’d by no means understand. It sort of feels too complicated and extremely huge for me. I’m looking forward to your next post, I’ll try to get the hang of it!
[Reply]
拜读大哥这篇文章受益匪浅,大哥的源文件我看了好几遍.我就是搞不明白 源文件的_uid 和_suffix两个变量个只的是什么?
[Reply]
您好!今天向您的邮箱发送了一封请教的邮件,希望大哥您查收.主要是关于服务器端接受文件大于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]