【问题标题】:Howto do a simple ftp get file on Android如何在 Android 上做一个简单的 ftp 获取文件
【发布时间】:2011-08-13 21:51:00
【问题描述】:

我在任何地方都找不到文件的简单 FTP 访问示例,并且 FTPClient 类(有几个示例使用)没有出现在 Android 类索引中。我有 http 访问工作,但我如何做一个简单的 FTP 获取?我想要做的就是下载(例如): ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT 它不应该需要登录、更改目录等。 只是将该 URL 提供给 http 访问方法似乎不起作用。

这类似于以下问题: unable to read file from ftp in android?

我尝试了一个简单的:

  StringBuilder response = new StringBuilder();
  URLConnection ftpConn;
  try {
  URL netUrl = new URL("ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT");
  ftpConn = netUrl.openConnection();
  BufferedInputStream bufRd = new BufferedInputStream(ftpConn.getInputStream());
  int temp;
  while ((temp = bufRd.read()) != -1) {
      response.append(temp);
  }
  bufRd.close();
  } catch (Exception e) {
      return "Failure";
  }

但它在 getInputStream 上出现异常: 无法连接服务器:无法配置数据端口

此外,必须有一种比逐字节更智能的方式将数据从流缓冲区中提取出来,不是吗?我也找不到。

最后,我需要同时进行 http 和 ftp 访问,有什么理由不对这两种访问类型使用 URLConnection 吗?还是将 HttpConnection 用于 http,将 URLConnection 用于 ftp 更好?

谢谢!

【问题讨论】:

  • 您的清单中是否有互联网使用权限?
  • 是的,我在那个上花了几个小时,这在几个小时前是一个很好的猜测。 :-) 我确实让 http 工作,但不是 ftp。
  • 我还注意到,如果我在模拟器上将那个 URL 输入谷歌,它会显示“网页不可用”并且它在普通浏览器中。如果我直接在浏览器窗口中输入该 URL,它似乎只需要 50 个字符,不会占用全部内容。这些是模拟器中的错误吗?
  • 请帮忙!或者,如果 ftp 在 Eclipse 模拟器上不起作用,也请告诉我并提供解决方法的建议。它是否适用于真实硬件?

标签: android ftpwebrequest


【解决方案1】:

哇!我终于搞定了。我放弃了在 webOS 和 WPF/C# 中工作的简单方法,你可以只做一个 ftp:://... 你必须使用 FTPClient 包。

修复库访问(项目 | 属性 | Java 构建路径 | 库 | 添加 JAR...)后,我摆弄了调用,直到它开始工作。这是我的 FTPClient 调用的顺序。在我将它设置为被动模式之前它不会工作。

  mFTPClient = new FTPClient();
  mFTPClient.connect("tgftp.nws.noaa.gov");      
  mFTPClient.login("anonymous","nobody");
  mFTPClient.enterLocalPassiveMode();
  mFTPClient.changeWorkingDirectory("/data/forecasts/taf/stations");
  InputStream inStream = mFTPClient.retrieveFileStream("KABQ.TXT");
  InputStreamReader isr = new InputStreamReader(inStream, "UTF8");

【讨论】:

  • 看起来我可以在同一个调用中组合目录路径和文件:InputStream inStream = mFTPClient.retrieveFileStream("/data/forecasts/taf/stations/KABQ.TXT");
  • 我正在尝试做与您完全相同的事情,只是使用不同的电台。我们可以看看你的代码吗?
【解决方案2】:

我还在网上某个地方找到了“逐字节”问题的答案。这似乎可以将 InputStream 类型直接转换为 String 类型:

      String theStr = new Scanner(inStream).useDelimiter("\\A").next();

【讨论】:

    【解决方案3】:

    我还寻找了一个不使用 3rd 方库的简单 ftp 下载示例。没有找到,所以在这里发布我的解决方案。

    默认情况下,URLConnection 使用用户名“anonymous”,密码为空,许多 ftp 服务器不接受该用户名,因为它们需要电子邮件作为“anonymous”的密码。

    要在您的应用中使用以下代码,只需添加 try..catch 并确保从流中读取不会阻塞 UI 线程。

    URL url = new URL("ftp://ftp.mozilla.org/README");
    URLConnection cn = url.openConnection();
    cn.setRequestProperty ("Authorization", "Basic " + Base64.encodeToString("anonymous:a@b.c".getBytes(), Base64.DEFAULT));
    
    final File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    FileOutputStream fos = new FileOutputStream(dir.getPath() + "/README");
    
    InputStream is = cn.getInputStream();
    int bytesRead = -1;
    byte[] buf = new byte[8096];
    while ((bytesRead = is.read(buf)) != -1) {
        fos.write(buf, 0, bytesRead);
    }
    if(is != null)is.close();
    if(fos != null){ fos.flush(); fos.close(); }
    

    希望这会为您节省一些时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多