B2B网络软件

 找回密码
 立即注册 审核网站号:QQ:896757558
搜索
查看: 1|回复: 0
打印 上一主题 下一主题

FTP单文件运行例子

[复制链接]

1188

主题

1193

帖子

8029

积分

abc

Rank: 9Rank: 9Rank: 9

积分
8029
跳转到指定楼层
楼主
FTP单文件运行例子
FTP单文件运行例子 B2B网络软件

FTP单文件运行例子 B2B网络软件

FTP单文件运行例子 B2B网络软件

FTP单文件运行例子 B2B网络软件

  1. /*
  2. * AIWROK FTP 独立用法脚本(纯 Rhino / JDK,零 importClass、零第三方 dex、零外部模块)
  3. * 实现方式:用 java.net.Socket 手写 FTP 协议(RFC 959),原生支持:
  4. *   连接/登录、上传(STOR)、下载(RETR)、查询列目录(LIST)、当前目录(PWD)。
  5. * 注意:除 java.* 标准类外不引用任何资源,可直接运行。
  6. * 若列出中文文件名出现乱码,把 ftpList 里 InputStreamReader 的编码从 "ISO-8859-1" 改成 "GBK" 或 "UTF-8" 即可。
  7. */

  8. // ============ ① 顶部配置区(用户改这里即可跑) ============
  9. var FTP_HOST = "154.221.80.195";                       // FTP 服务器地址
  10. var FTP_PORT = 21;                                     // FTP 端口,默认 21
  11. var FTP_USER = "ghgfggggj";                         // 登录用户名
  12. var FTP_PASS = "CrSaz4611bx1B";                     // 登录密码

  13. var LOCAL_UPLOAD = "/sdcard/auto/aiwork_ftp_sample.txt";   // 要上传的本地文件(演示会自动生成,无需手动准备)
  14. var REMOTE_UPLOAD_PATH = "/aiwork_ftp_sample.txt";         // 上传后保存在远程的路径(含文件名,放根目录更安全)

  15. var REMOTE_DOWNLOAD_PATH = "/aiwork_ftp_sample.txt";       // 要从远程下载的文件路径(用刚上传的同名文件,演示自洽)
  16. var LOCAL_DOWNLOAD = "/sdcard/auto/aiwork_ftp_sample_downloaded.txt"; // 下载保存到本地的路径

  17. var LIST_DIR = "/";                                    // 要列出内容的远程目录,"/" 表示根目录

  18. // ============ 全局控制连接 ============
  19. var ctrlSock = null;
  20. var ctrlOut = null;
  21. var ctrlReader = null;

  22. // 读取一条控制回复(多行回复以 "code " 结尾,遇到即停)
  23. function readReply() {
  24.     var full = "", code = "";
  25.     while (true) {
  26.         var line = ctrlReader.readLine();
  27.         if (line == null) break;
  28.         line = String(line);          // 强制转成 JS 字符串:否则 Rhino 下 Java String 与 "220" 这种字面量用 !== 永远不等
  29.         full += line + "\n";
  30.         if (/^[0-9][0-9][0-9] /.test(line)) { code = line.substring(0, 3); break; }
  31.     }
  32.     return { code: code, text: full };
  33. }

  34. // 发送命令(强制 CRLF)
  35. function sendCmd(cmd) {
  36.     // 用 java.lang.String 包一层保证有 getBytes;write 用三参形式避免 Rhino 把 write(byte[]) 误判成 write(int)
  37.     var b = new java.lang.String(cmd + "\r\n").getBytes("ISO-8859-1");
  38.     ctrlOut.write(b, 0, b.length);
  39.     ctrlOut.flush();
  40. }

  41. // 解析 PASV 回复 -> { ip, port }
  42. function parsePasv(text) {
  43.     var m = text.match(/\(([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+)\)/);
  44.     if (!m) return null;
  45.     var ip = m[1] + "." + m[2] + "." + m[3] + "." + m[4];
  46.     var port = (parseInt(m[5], 10) * 256) + parseInt(m[6], 10);
  47.     return { ip: ip, port: port };
  48. }

  49. // 发 PASV 并打开被动数据连接
  50. function openPasvData() {
  51.     var r = readReply();            // 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)
  52.     var info = parsePasv(r.text);
  53.     if (!info) { printl("[FTP] PASV 解析失败: " + r.text); return null; }
  54.     // 数据连接优先用「控制连接的公网 IP(FTP_HOST) + PASV 端口」:
  55.     //   很多服务器 PASV 回复里写的是内网 IP(NAT 缺陷),从外部连不通;
  56.     //   而用我们连控制通道的公网 IP + PASV 端口通常可达(已实测 154.201.80.125 可行)。
  57.     // 若公网连不通(如客户端与服务器同局域网、内网 IP 才通),回退到 PASV 回复里的 IP。
  58.     var ds = null;
  59.     try {
  60.         ds = new java.net.Socket(FTP_HOST, info.port);
  61.     } catch (e1) {
  62.         try { ds = new java.net.Socket(info.ip, info.port); }
  63.         catch (e2) { printl("[FTP] 数据连接失败: " + e2); return null; }
  64.     }
  65.     ds.setSoTimeout(15000);
  66.     return ds;
  67. }

  68. // ============ 连接 / 登录 ============
  69. function ftpConnect() {
  70.     try {
  71.         ctrlSock = new java.net.Socket(FTP_HOST, FTP_PORT);
  72.         ctrlSock.setSoTimeout(15000);
  73.         ctrlOut = ctrlSock.getOutputStream();
  74.         ctrlReader = new java.io.BufferedReader(new java.io.InputStreamReader(ctrlSock.getInputStream(), "ISO-8859-1"));
  75.         var welcome = readReply();
  76.         if (welcome.code !== "220") { printl("[FTP] 服务器未就绪(" + welcome.code + "): " + welcome.text); return false; }
  77.         sendCmd("USER " + FTP_USER);
  78.         readReply();
  79.         sendCmd("PASS " + FTP_PASS);
  80.         var r2 = readReply();
  81.         if (r2.code !== "230") { printl("[FTP] 登录失败(" + r2.code + "): " + r2.text); return false; }
  82.         sendCmd("TYPE I");            // 二进制传输,必须设置(否则图片/压缩包损坏)
  83.         readReply();
  84.         printl("[FTP] 连接成功");
  85.         return true;
  86.     } catch (e) {
  87.         printl("[FTP] 连接异常: " + e);
  88.         return false;
  89.     }
  90. }

  91. // ============ 查询 / 列目录 ============
  92. function ftpList(dir) {
  93.     try {
  94.         if (ctrlSock == null) { printl("[FTP] 尚未连接,请先调用 ftpConnect()"); return -1; }
  95.         var target = (dir == null || dir === "") ? "/" : dir;
  96.         sendCmd("PASV");
  97.         var ds = openPasvData();
  98.         if (ds == null) return -1;
  99.         sendCmd("LIST " + target);
  100.         readReply();                  // 150 开始
  101.         var dr = new java.io.BufferedReader(new java.io.InputStreamReader(ds.getInputStream(), "ISO-8859-1"));
  102.         var line, count = 0;
  103.         printl("[FTP] 目录 " + target + " 内容如下:");
  104.         while ((line = dr.readLine()) != null) {
  105.             printl("  " + line);
  106.             count++;
  107.         }
  108.         dr.close(); ds.close();
  109.         readReply();                  // 226 结束
  110.         printl("[FTP] 目录共 " + count + " 个条目");
  111.         return count;
  112.     } catch (e) {
  113.         printl("[FTP] 列目录异常: " + e);
  114.         return -1;
  115.     }
  116. }

  117. // ============ 上传 ============
  118. function ftpUpload(localPath, remotePath) {
  119.     var fis = null, ds = null;
  120.     try {
  121.         if (ctrlSock == null) { printl("[FTP] 尚未连接,请先调用 ftpConnect()"); return false; }
  122.         var f = new java.io.File(localPath);
  123.         if (!f.exists()) { printl("[FTP] 本地文件不存在: " + localPath); return false; }
  124.         sendCmd("PASV");
  125.         ds = openPasvData();
  126.         if (ds == null) return false;
  127.         sendCmd("STOR " + remotePath);
  128.         readReply();                  // 150 开始
  129.         var dout = ds.getOutputStream();
  130.         fis = new java.io.FileInputStream(f);
  131.         var buf = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 4096);
  132.         var len;
  133.         while ((len = fis.read(buf)) > 0) { dout.write(buf, 0, len); }
  134.         fis.close(); fis = null;
  135.         dout.flush(); ds.close(); ds = null;
  136.         var done = readReply();       // 226 结束
  137.         var ok = (done.code === "226" || done.code === "250");
  138.         printl(ok ? ("[FTP] 上传成功: " + localPath + " -> " + remotePath) : ("[FTP] 上传失败(" + done.code + "): " + done.text));
  139.         return ok;
  140.     } catch (e) {
  141.         printl("[FTP] 上传异常: " + e);
  142.         return false;
  143.     } finally {
  144.         if (fis != null) try { fis.close(); } catch (x) {}
  145.         if (ds != null) try { ds.close(); } catch (x) {}
  146.     }
  147. }

  148. // ============ 下载 ============
  149. function ftpDownload(remotePath, localPath) {
  150.     var fos = null, ds = null;
  151.     try {
  152.         if (ctrlSock == null) { printl("[FTP] 尚未连接,请先调用 ftpConnect()"); return false; }
  153.         var lf = new java.io.File(localPath);
  154.         var parent = lf.getParentFile();
  155.         if (parent != null && !parent.exists()) parent.mkdirs();
  156.         sendCmd("PASV");
  157.         ds = openPasvData();
  158.         if (ds == null) return false;
  159.         sendCmd("RETR " + remotePath);
  160.         var r = readReply();          // 150 开始
  161.         if (r.code !== "150" && r.code !== "125") { printl("[FTP] 下载无法开始(" + r.code + "): " + r.text); ds.close(); return false; }
  162.         var din = ds.getInputStream();
  163.         fos = new java.io.FileOutputStream(lf);
  164.         var buf = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 4096);
  165.         var len;
  166.         while ((len = din.read(buf)) > 0) { fos.write(buf, 0, len); }
  167.         fos.close(); fos = null;
  168.         ds.close(); ds = null;
  169.         var done = readReply();       // 226 结束
  170.         var ok = (done.code === "226" || done.code === "250");
  171.         printl(ok ? ("[FTP] 下载成功: " + remotePath + " -> " + localPath) : ("[FTP] 下载失败(" + done.code + "): " + done.text));
  172.         return ok;
  173.     } catch (e) {
  174.         printl("[FTP] 下载异常: " + e);
  175.         return false;
  176.     } finally {
  177.         if (fos != null) try { fos.close(); } catch (x) {}
  178.         if (ds != null) try { ds.close(); } catch (x) {}
  179.     }
  180. }

  181. // ============ 当前工作目录 ============
  182. function ftpPwd() {
  183.     try {
  184.         sendCmd("PWD");
  185.         var r = readReply();          // 257 "/xxx" is current directory
  186.         var m = r.text.match(/"(.*)"/);
  187.         return m ? m[1] : r.text;
  188.     } catch (e) { return ""; }
  189. }

  190. // ============ 关闭连接 ============
  191. function ftpClose() {
  192.     try {
  193.         if (ctrlSock != null) {
  194.             try { sendCmd("QUIT"); readReply(); } catch (x) {}
  195.             try { ctrlSock.close(); } catch (x) {}
  196.             printl("[FTP] 连接已关闭");
  197.         }
  198.     } catch (e) { printl("[FTP] 关闭异常: " + e); }
  199. }

  200. // ============ 辅助:自动生成本地样例文件(演示用) ============
  201. function ensureLocalSample(localPath) {
  202.     try {
  203.         var f = new java.io.File(localPath);
  204.         if (f.exists()) return true;
  205.         var p = f.getParentFile();
  206.         if (p != null && !p.exists()) p.mkdirs();
  207.         var fw = new java.io.FileWriter(f);
  208.         fw.write("AIWROK FTP 演示样例文件\n生成时间: " + ("" + java.lang.System.currentTimeMillis()));
  209.         fw.close();
  210.         printl("[FTP] 已自动生成本地样例文件: " + localPath);
  211.         return true;
  212.     } catch (e) { printl("[FTP] 生成样例文件失败: " + e); return false; }
  213. }

  214. // ============ main 演示(连接→PWD→列目录→上传→列目录→下载→关闭) ============
  215. function main() {
  216.     printl("========== FTP 独立用法演示开始(纯 Socket,无 importClass) ==========");
  217.     if (!ftpConnect()) { printl("[FTP] 连接失败,演示终止"); return; }
  218.     printl("[FTP] 当前工作目录: " + ftpPwd());
  219.     printl("----- 上传前列出 " + LIST_DIR + " -----");
  220.     ftpList(LIST_DIR);
  221.     ensureLocalSample(LOCAL_UPLOAD);
  222.     ftpUpload(LOCAL_UPLOAD, REMOTE_UPLOAD_PATH);
  223.     printl("----- 上传后列出 " + LIST_DIR + " -----");
  224.     ftpList(LIST_DIR);
  225.     ftpDownload(REMOTE_DOWNLOAD_PATH, LOCAL_DOWNLOAD);
  226.     ftpClose();
  227.     printl("========== FTP 独立用法演示结束 ==========");
  228. }

  229. main();
复制代码


回复

使用道具 举报

本版积分规则

关闭

QQ|»营销软件综合讨论|»营销软件有问必答|»营销软件教程专区|»营销软件POST脚本分享|»营销软件普通脚本分享|»营销软件软件资讯|»营销软件精品软件|»营销软件更新公告|营销软件|B2B软件|B2B网络软件 ( 京ICP备09078825号 )本网站开发的营销软件是一款新的网络营销软件,这款营销可以去网站软件,博客软件,B2B软件,分类信息网发贴,可以抢沙发,可以到百度文库上传WORD文档,可以到一些是相册网站自动上传图片,这个自动发帖软件自带云蜘蛛,加快收录,有6种对接打码接口,方便,效率高,速度快,而且对拖动的验证码全网第一家独家支持,全部原创技术,独家研发,正版原创带版权软件。选择万能营销软件,就选择了一种赚钱的效率,从没有被超越过,一直在努力研发新技术。放飞梦想,解放双手,来点创意,成就你的梦想,就在万能营销软件开始

map2

GMT+8, 2026-10-9 07:36 , Processed in 0.097639 second(s), 35 queries .

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