aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 15970|回复: 8

一个简单的ftp上传显示进度的程序

[复制链接]

3

主题

13

回帖

93

积分

一级会员

积分
93
发表于 2017-10-9 18:50:35 | 显示全部楼层 |阅读模式
本帖最后由 CriSLyx 于 2017-10-9 18:57 编辑

程序ftp上传部分借鉴了@Else老兄的代码,原有只提供了控制台中输出上传进度的功能,
我对相关功能进行了修改,增加了winform界面的static控件及progress控件的功能,也通过编写这个
程序,也初步掌握了工作线程与界面线程的基础知识和线程消息的有关操作。寻遍了多个aardio网站及
论坛也没找到FTP上传显示进度的源码,特与大家一同分享,代码拙劣,请各位多多指点。
                                                     ———— CriSLyx 20171009




  1. import win.ui;
  2. import thread.command;
  3. import thread.manage;
  4. import fsys.dlg;
  5. /*DSG{{*/
  6. mainForm = win.form(text="ftp上传测试";right=759;bottom=469)
  7. mainForm.add(
  8. btnSwitch={cls="button";text="开始";left=656;top=24;right=736;bottom=128;disabled=1;dr=1;dt=1;font=LOGFONT(name='思源黑体 Normal';h=-19;weight=350);z=7};
  9. btnUpload={cls="button";text="选择文件";left=552;top=24;right=648;bottom=128;dr=1;dt=1;font=LOGFONT(name='思源黑体 Normal';h=-19;weight=350);z=2};
  10. strProgress={cls="static";left=456;top=96;right=544;bottom=127;dr=1;dt=1;font=LOGFONT(h=-16);transparent=1;z=6};
  11. txtLocalFile={cls="static";text="本地文件:";left=24;top=32;right=528;bottom=56;aw=1;dl=1;dt=1;transparent=1;z=3};
  12. txtRemoteFile={cls="static";text="远程文件:";left=24;top=64;right=528;bottom=88;aw=1;dl=1;dt=1;transparent=1;z=5};
  13. uploadList={cls="listview";left=24;top=144;right=736;bottom=448;ah=1;asel=false;aw=1;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(name='Source Sans Pro Semibold';h=-16;weight=600);fullRow=1;gridLines=1;msel=false;z=4};
  14. uploadProgress={cls="progress";left=24;top=96;right=440;bottom=126;aw=1;dl=1;dr=1;dt=1;edge=1;max=100;min=0;z=1}
  15. )
  16. /*}}*/
  17. threadUpload=function(host,username,password,uploadList){
  18.         import inet.ftp;
  19.         import thread.command;
  20.         import fsys.dlg;
  21.         import fsys.file;
  22.         import fsys;
  23.     ftpConn=inet.ftp(host,username,password); //创建FTP连接
  24.     min,fileCount=table.range(uploadList); //获取uploadList计数,用table.count有时会不准
  25.     for(i=1;fileCount;1){
  26.             var localFile=uploadList[i][3];
  27.                 var remoteFile=uploadList[i][4];
  28.                 var fid=tonumber(uploadList[i][1]);
  29.                 thread.command.uploadStatus(fid,"开始上传"); //使用thread.command向主线程传递消息         
  30.             var localFileHandle = io.open(localFile,"rb");  //打开本地文件
  31.             var remoteFileHandle = ftpConn.open("/"++remoteFile,"wb"); //打开FTP远端文件
  32.             thread.command.localFile(localFile); //使用thread.command向主线程传递消息                 
  33.                 thread.command.remoteFile(remoteFile);        //使用thread.command向主线程传递消息         
  34.             var buffer = raw.malloc(1000);//按照1000字节分块上传
  35.             var uploadSum =0;
  36.             var localSize=tonumber(localFileHandle.size64()); //获取本地文件大小
  37.             jindu=0;
  38.             while(var size; size = localFileHandle.readBuffer(buffer);size) //按照buffer大小循环读取文件同时上传
  39.             {
  40.                       remoteFileHandle.writeBuffer(buffer,size);
  41.                       uploadSum = uploadSum +tonumber(fsys.formatSize(size));
  42.                       var uploadPercent = string.format("%.2f",uploadSum/localSize*100);
  43.                       thread.command.setProgress(uploadPercent) //使用thread.command向主线程传递消息,设置进度条进度
  44.             }
  45.             thread.command.uploadStatus(fid,"上传成功");         
  46.             localFileHandle.close();
  47.             remoteFileHandle.close();
  48.     }
  49. }
  50. mainFormInitial=function(){
  51.         mainForm.uploadList.insertColumn("序号",50,,0x2/*_LVCFMT_CENTER*/);
  52.         mainForm.uploadList.insertColumn("状态",120,,0x2/*_LVCFMT_CENTER*/);
  53.         mainForm.uploadList.insertColumn("本地文件",300,,0x2/*_LVCFMT_CENTER*/);
  54.         mainForm.uploadList.insertColumn("远程文件",300,,0x2/*_LVCFMT_CENTER*/);
  55. }
  56. mainForm.btnUpload.oncommand = function(id,event){
  57.         mainForm.uploadList.items={};
  58.         uploadFileList=fsys.dlg.openEx("所有文件|*.*");
  59.         for(fid,filePath in uploadFileList){
  60.                 mainForm.uploadList.addItem({fid;"等待";filePath;fsys.getFileName(filePath)});
  61.         }
  62.         mgr=thread.manage(1); //创建线程管理器
  63.         mgr.create(threadUpload,"192.168.1.1","9999","636363",mainForm.uploadList.items).onEnd = function(...){
  64.                 mainForm.msgbox("上传完成!");   //创建线程并设置回调
  65.                 mainForm.btnSwitch.text="开始"
  66.                 mainForm.btnSwitch.disabled=true;
  67.         }
  68.         mgr.suspend(); //创建后先行暂停 点击开始后 线程再继续执行。
  69.         mainForm.btnSwitch.disabled=false;
  70.         mgr.waitClose() //等待线程关闭
  71. }
  72. mainForm.btnSwitch.oncommand = function(id,event){
  73.         //mainForm.msgbox( mainForm.btnSwitch.text );
  74.         if(mainForm.btnSwitch.text="开始"){
  75.                 mgr.resume();  //继续执行线程
  76.                 mainForm.btnSwitch.text="暂停"
  77.         }else{
  78.                 mgr.suspend();   //继续执行线程
  79.                 mainForm.btnSwitch.text="开始"
  80.         }
  81.         
  82. }

  83. var listener = thread.command(); //设置监听操作,接受线程消息
  84. listener.localFile = function( strLocalFile ){
  85.     mainForm.txtLocalFile.text="本地文件:" ++ strLocalFile
  86. }
  87. listener.remoteFile = function( strRemoteFile ){
  88.     mainForm.txtRemoteFile.text="远程文件:" ++ strRemoteFile
  89. }
  90. listener.setProgress = function( pos ){
  91.     mainForm.uploadProgress.pos=pos;
  92.     mainForm.strProgress.text=pos++"%";
  93. }
  94. listener.uploadStatus=function(fid,strStatus){
  95.         mainForm.uploadList.setItemText(strStatus,fid,2);
  96.         mainForm.uploadList.ensureVisible(fid);         
  97. }
  98. mainFormInitial();
  99. mainForm.enableDpiScaling();
  100. mainForm.show();

  101. win.loopMessage();
复制代码


动画演示

动图录制问题,进度条不是那么连贯

3

主题

13

回帖

93

积分

一级会员

积分
93
 楼主| 发表于 2017-10-9 18:53:30 | 显示全部楼层
因为时间有限,没有对代码做异常处理。

9

主题

28

回帖

256

积分

二级会员

积分
256
发表于 2017-10-10 10:03:28 | 显示全部楼层
CriSLyx 发表于 2017-10-9 18:53
因为时间有限,没有对代码做异常处理。

厉害了!刚好需要这方面的东西,感谢分享!

2

主题

34

回帖

452

积分

培训班

积分
452
发表于 2017-10-10 10:06:38 | 显示全部楼层
这个很实用,感谢分享,大字好评!

0

主题

26

回帖

296

积分

二级会员

积分
296
发表于 2017-10-10 11:40:29 | 显示全部楼层
感谢分享!

1

主题

10

回帖

142

积分

一级会员

积分
142
发表于 2017-10-10 12:29:09 | 显示全部楼层
感谢分享!!

38

主题

129

回帖

1045

积分

荣誉会员

积分
1045
发表于 2017-10-10 13:04:48 | 显示全部楼层
学习啦

0

主题

2

回帖

50

积分

一级会员

积分
50
发表于 2017-10-20 13:11:07 | 显示全部楼层

0

主题

2

回帖

11

积分

新手入门

积分
11
发表于 2017-12-27 12:10:19 | 显示全部楼层
我只想默默的点个赞                                 
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-4-15 04:08 , Processed in 0.059387 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表