【问题标题】:Upload file using Apache FTP Client does not work使用 Apache FTP 客户端上传文件不起作用
【发布时间】:2015-07-20 14:08:06
【问题描述】:

我已经阅读了半打关于此的主题,但我离解决方案还很近。无论我改变什么,我都会得到 ftp 返回码 500“命令未被接受,请求的操作没有发生。”而且我不确定如何调试它。

这是我的网站,我可以连接 CoreFTP 并进行读写,所以这似乎不是权限问题。我尝试了两个不同的帐户,使用此代码和 CoreFTP。一个写入根目录,另一个指向“image_in”文件夹。

imageData 是一个长度为 166578 的字节数组,在 InputStream 调用后,stream 的长度相同。 storeFile() 总是返回 false,返回码为 500。

一个线程暗示 enterLocalPassiveMode() 和 enterRemotePassiveMode() 是罪魁祸首,但我已经尝试了这段代码,无论有没有这些行,我仍然得到 500 返回码。

知道我错过了什么吗?

格雷格

class ImageUploadTask extends AsyncTask <Void, Void, String>{
    @Override
    protected String doInBackground(Void... unsued) {
        try {
            boolean status = false;
            try {
                FTPClient mFtpClient = new FTPClient();
                String ip = "my domain dot com";
                String userName = "ftp79815757-0";
                String pass = "my password";

                mFtpClient.connect(InetAddress.getByName(ip));
                mFtpClient.login(userName, pass);
                int reply = mFtpClient.getReplyCode();
                if (FTPReply.isPositiveCompletion(reply)) {

        //one thread said this would do the trick
                    mFtpClient.enterLocalPassiveMode();
                    mFtpClient.enterRemotePassiveMode();

                    InputStream stream = new ByteArrayInputStream(imageData);

                    mFtpClient.changeWorkingDirectory("/images_in");                        
                    String currdir = mFtpClient.printWorkingDirectory();

                    if (!mFtpClient.storeFile("remoteName.jpg", stream)) {
                        Log.e("FTPUpload", String.valueOf(mFtpClient.getReplyCode()));
                    }

                    stream.close(); 
                    mFtpClient.disconnect();
                }
                else {
                    Log.e("FTPConnected", String.valueOf(reply));
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        } catch (Exception e) {
            if (dialog.isShowing())
                dialog.dismiss();
            Toast.makeText(getApplicationContext(),
                    "Error",
                    Toast.LENGTH_LONG).show();
            Log.e(e.getClass().getName(), e.getMessage(), e);
            return null;
        }
    }

【问题讨论】:

  • 您还有其他异常吗?您是否在 Manifest.xml 中添加了所需的权限?
  • 代码中没有 Java 异常,也没有其他 FTP 异常。清单中的权限是 Internet、写入外部存储和读取联系人。当我合并 FTP 时添加了 Internet。是否需要其他清单权限?
  • 我还尝试将端口显式设置为 21,并且我同时使用 mFtpClient.setFileType(FTP.ASCII_FILE_TYPE) 和 mFtpClient.setFileType(FTP.BINARY_FILE_TYPE);仍然得到返回码 500,
  • 所以您想使用 FTP 从 android 上传文件 .. 您在互联网上关注哪个示例?如果您使用的是ftp4j,那么有很多工作示例
  • 是的,来自安卓的 ftp。我见过的所有示例都使用 org.apache.commons.net.ftp.FTP

标签: java android apache ftp


【解决方案1】:

您忘记设置文件类型

mFtpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);

如果它仍然不起作用,那么您有以下选择:

如果您坚持使用Apache FTP Client,请关注this example

或者你可以试试this example

第二个例子适用于我的情况。

【讨论】:

  • 谢谢,但如果你看看我上面的 cmets,我试过了,仍然得到代码 500。我不坚持使用任何东西。当我搜索 Java FTP 时,Apache 反复出现。我改为ftp4j,但现在有不同的问题,这需要一个新问题。您列出的示例与我一遍又一遍的相同。真正的区别是他们从文件系统发送一个文件,我的是 InputStream,这是一个重要的变化。我想知道这是否是关键。
  • 第一个使用ftp4j 的示例使用BufferedInputStream,但该示例已经有将近5 年的历史了。事情会改变的。所以是的,首先尝试从文件目录上传一个简单的文件。看看是否可行。如果它有效,那么您可能会到达某个地方
  • 是FTP,能改多少?无论如何,我假设您是在暗示 5 岁是不好的,但也许不是。 BufferedInputStream 比 InputStream 好吗?我会尝试一个文件。
  • 是的BufferedInputStream 更好。并且说它是旧的,它并不意味着 FTP 本身,而是底层操作系统对此类库的支持。不过我可能错了。
  • 切换到文件路径而不是字节数组,仍然得到返回码 500。{Wimper} 大约 20 年前,我用 Visual Basic 3 编写了我的第一个 FTP 客户端。谁知道这会让我在 Java 中屈服。这个问题记录了我在使用 ftp4j stackoverflow.com/questions/30146653/asynctask-does-not-execute 时遇到的奇怪问题。我曾经对 Java 又爱又恨。现在我只是讨厌它。
【解决方案2】:

您需要使用:enterLocalPassiveMode

mFtpClient.enterLocalPassiveMode();

如果您随后执行其他操作,您可能需要使用enterLocalActiveMode 重新激活。

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多