如何在Android上执行简单的ftp get文件

时间:2011-08-13 21:51:00

标签: android ftpwebrequest

我找不到任何地方对文件进行简单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?或者对于ftp使用HttpConnection和为ftp使用URLConnection是否更好?

谢谢!

3 个答案:

答案 0 :(得分:9)

呼!我终于明白了。我放弃了在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");

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我还在不使用第三方库的情况下寻找一个简单的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(); }

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