java - 为什么我的 InputStream 在 Android 中无法工作?

标签 java android open-source ftp apache-commons

我正在为我最喜欢的图片库软件编写一个 Android 图像文件 uploader ,它使用 FTP。 我已经开始使用 Apache-Commons Net FTP 作为我的 ftp 库,基于 past stack overflow questions 。就像这样:

FTPClient ftp = new FTPClient();
try{
  ftp.connect(host);
  Log.i(TAG,"we connected");
  if(!ftp.login(user,pass)){
    ftp.logout();
    //TODO: alert user it didn't happen
    return;
  }    
  String replyStatus = ftp.getStatus();
  Log.i(TAG,replyStatus);
  int replyCode = ftp.getReplyCode();
  if (!FTPReply.isPositiveCompletion(replyCode))
  {    
    ftp.disconnect();
    //TODO: alert user it didn't happen
    return;
  }    
  Log.i(TAG,"we logged in");
  ftp.changeWorkingDirectory(path);
  ftp.setFileType(ftp.BINARY_FILE_TYPE);
  for(int i = 0; i < contentUris.size(); i++){
    Log.i(TAG,"uploading new file");
    Uri stream = (Uri) contentUris.get(i);
    //InputStream in = openFileInput(getRealPathFromURI(stream));
    InputStream in =this.getContentResolver().openInputStream(stream);
    BufferedInputStream buffIn=null;
    buffIn=new BufferedInputStream(in);

    ftp.setFileType(ftp.BINARY_FILE_TYPE);
    boolean Store = ftp.storeFile("test.jpg", buffIn);
    Log.i(TAG, "uploaded test");
  }      
  ftp.disconnect();
}      
catch(Exception ex){
  //do something wise and smart and useful
}

我在日志中看到我正在登录,我可以更改目录,并且当我上传时,我会在我的目录中获得一个 test.jpg,但大小为 0 字节。

什么给了?我没有打开输入流吗?我该如何正确地做到这一点?

如果我没有提供足够的详细信息,请告诉我 - full code is also available on github

最佳答案

看起来问题是您无法建立主动 ftp 连接,您必须使用被动模式。因此将顶部更改为:ftpClient.enterLocalPassiveMode();

FTPClient ftp = new FTPClient();
try{
  ftp.connect(host);
  ftp.enterLocalPassiveMode();
  Log.i(TAG,"we connected");
  if(!ftp.login(user,pass)){
    ftp.logout();
    //TODO: alert user it didn't happen
    return;
  }
  String replyStatus = ftp.getStatus();
  Log.i(TAG,replyStatus);
  int replyCode = ftp.getReplyCode();
  if (!FTPReply.isPositiveCompletion(replyCode))
  {
    ftp.disconnect();
    //TODO: alert user it didn't happen
    return;
  }

  Log.i(TAG,"we logged in");
  ftp.changeWorkingDirectory(path);
  ftp.setFileType(ftp.BINARY_FILE_TYPE);
  for(int i = 0; i < contentUris.size(); i++){
    Log.i(TAG,"uploading new file");
    Uri stream = (Uri) contentUris.get(i);
    String filePath = getRealPathFromURI(stream);
    InputStream in = new FileInputStream(filePath);
    ftp.setFileType(ftp.BINARY_FILE_TYPE);

    boolean Store = ftp.storeFile("test.jpg", in);
    Log.i(TAG, "uploaded test");
  }


  ftp.disconnect();
}
catch(Exception ex){
  //TODO: properly handle exception
  //Log.i(TAG,ex);
  //TODO:Alert the user this failed
}

关于java - 为什么我的 InputStream 在 Android 中无法工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551937/

相关文章:

java - 如何在 java 中返回对象数组?

java - 从文件输入中查找java中的最大值

android - 无法解析 com.android.support :design:28. 0.0

java - 与版本 1.0 兼容的客户端 Socket.io 的 Android 实现 - 初学者

android - 寻找 Android 电子书编程的开源引用

java - 寻找一个开源的、基于 Java 的个性化引擎

java - 如何实现执行结束自动关闭的线程池?

java - 我在为包含整数 1-25 的数组创建循环并每行打印 5 个数字时遇到问题

java - 在这种情况下如何设置R.string.resource_name

用于建模 2D、3D 数据的 Javascript 控件