Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android上实现一个简单的ftp获取文件_Android_Ftpwebrequest - Fatal编程技术网

如何在Android上实现一个简单的ftp获取文件

如何在Android上实现一个简单的ftp获取文件,android,ftpwebrequest,Android,Ftpwebrequest,我在任何地方都找不到一个简单的文件FTP访问的例子,而且FTPClient类(有几个例子使用)没有出现在Android类索引中。我已经有了http访问功能,但是如何实现简单的FTP访问呢?我只想下载(例如): 它不需要登录、更改目录等。 仅仅将该URL提供给http访问方法似乎不起作用 这与以下问题类似: 我尝试了一个简单的方法: StringBuilder response = new StringBuilder(); URLConnection ftpConn; try {

我在任何地方都找不到一个简单的文件FTP访问的例子,而且FTPClient类(有几个例子使用)没有出现在Android类索引中。我已经有了http访问功能,但是如何实现简单的FTP访问呢?我只想下载(例如): 它不需要登录、更改目录等。 仅仅将该URL提供给http访问方法似乎不起作用

这与以下问题类似:

我尝试了一个简单的方法:

  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?或者对http使用HttpConnection和对ftp使用URLConnection更好


谢谢

呼!我终于成功了。我放弃了在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类型直接转换为字符串类型:

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

我还寻找了一个不使用第三方LIB的简单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(); }

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

您的清单中是否有internet使用权限?是的,我花了几个小时在这上面,这在几个小时前是一个很好的猜测。:-)我确实使用了http,但没有使用ftp。我还注意到,如果我在模拟器上将该URL键入谷歌,它会显示“网页不可用”,并且在普通浏览器中。如果我直接在浏览器窗口中键入该URL,它似乎只需要50个字符,不会占用全部时间。模拟器中有这些bug吗?请帮助!或者,如果ftp在Eclipse emulator上不起作用,请让我知道这一点,并提供解决方法的建议。它在真正的硬件上工作吗?看起来我可以在同一个调用中组合目录路径和文件:InputStream inStream=mFTPClient.retrieveFileStream(“/data/forecast/taf/stations/KABQ.TXT”);我正试图做与你完全相同的事情,只是用不同的电台。我们能看看你的密码吗?