简体   繁体   中英

Android FTP upload - Files are not uploaded

I want to upload a file via ftp. I found some information's about it and built my class like I found it here: http://www.sebastianviereck.de/ftp-upload-mit-android/

I also added the internet permission in the manifest and set the strictmode like I found it here: Error StrictMode$AndroidBlockGuardPolicy.onNetwork

The result of storeFile ist treu and the reply code of the ftpClient is 226 ( "Closing data connection. Requested file action successful (for example, file transfer or file abort)" ).

So it looks fine for me, but the files are not uploaded.

Does someone have an Idea?

Here is my code:

Main:

FtpDataHandler ftp = new FtpDataHandler("serverName", "userName", "password", "/folder");
                    ftp.uploadFile("/storage/emulated/0/pictures/test_sig.jpg", "test_sig.jpg");

FTP handler:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;

import android.util.Log;

public class FtpDataHandler {
    private static final String TAG = "FtpDataHandler";

    String serverAdress;
    String userName;
    String password;
    String serverDirectory; 
    FTPClient ftpClient;

    public FtpDataHandler(String serverAdress, String userName, String password, String serverDiretory) {
        this.serverAdress = serverAdress;
        this.userName = userName;
        this.password = password;
        //this was my problem. I set the serverAdress to the serverDirectory insted the serverDirectory
        //this.serverDirectory = serverAdress;
        this.serverDirectory = serverDirectory;

        connect();
    }  

    public String getServerAdress() {
        return serverAdress;
    }

    public String getUserName() {
        return userName;
    }

    public String getServerDirectory() {
        return serverDirectory;
    }

    public boolean uploadFile(String localFilePath, String remoteFileName) {
        boolean result = false;

        BufferedInputStream buffIn = null;
        try {
            buffIn = new BufferedInputStream(new FileInputStream(localFilePath));
        } catch (FileNotFoundException e) {
            Log.d(TAG,
                    "FileNotFoundException: local File to be uploaded not Found: " + localFilePath);
        }
        ftpClient.enterLocalPassiveMode();

        try {
            result = ftpClient.storeFile(remoteFileName, buffIn);
            Log.d(TAG, "Reply code: " + ftpClient.getReplyCode());
        } catch (IOException e) {
            Log.d(TAG, "IOException: remote File could not be accessed");
        }
        try {
            buffIn.close();
        } catch (IOException e) {
            Log.d(TAG, "IOException: buffIn.close()");
        }

        return result;
    }

    public boolean connect(){
        boolean bool = false;
        ftpClient = new FTPClient();

        try {

            ftpClient.connect(this.serverAdress);
            bool = ftpClient.login(this.userName, this.password);
            if (!bool){
                Log.d(TAG, "Login Reply Code" + ftpClient.getReplyCode());
            }
            ftpClient.changeWorkingDirectory(this.serverDirectory);
            ftpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
        } catch (IOException e) {
            Log.d(TAG,
                    "IOException ftp Client could not be established.controll Login, Server, Pw.");
        }
        Log.d(TAG, "FTP Server Response: " + ftpClient.getReplyString());

        return bool;
    }

    public void unregisterConnection(){
        try {
            ftpClient.logout();
            ftpClient.disconnect();
        } catch (IOException e) {
            Log.d(TAG, "IOException: ftpClient close/logout");
        }
    }
}

Here is also the ftpClient.getReplyString() after the ftpClient.login, this.ftpClient.changeWorkingDirectory(this.serverDirectory), this.ftpClient.setFileType(2);

FTP Server Response: 200 Type set to I

And the reply code after this.ftpClient.storeFile(remoteFileName, buffIn);

Reply code: 226

I can upload a file via a Ftp Client like FileZilla or Turbo FTP Client. Here you can see the log of FileZilla used on my laptop.

2017-10-05 19:02:28 8160 1 Status: Resolving address of server.com
2017-10-05 19:02:28 8160 1 Status: Connecting to serverIp...
2017-10-05 19:02:28 8160 1 Status: Connection established, waiting for welcome message...
2017-10-05 19:02:28 8160 1 Response: 220 FTP on server.com ready
2017-10-05 19:02:28 8160 1 Command: AUTH TLS
2017-10-05 19:02:28 8160 1 Response: 234 AUTH TLS successful
2017-10-05 19:02:28 8160 1 Status: Initializing TLS...
2017-10-05 19:02:28 8160 1 Status: Verifying certificate...
2017-10-05 19:02:28 8160 1 Status: TLS connection established.
2017-10-05 19:02:28 8160 1 Command: USER user
2017-10-05 19:02:28 8160 1 Response: 331 Password required for user
2017-10-05 19:02:28 8160 1 Command: PASS ************
2017-10-05 19:02:28 8160 1 Response: 230 User user logged in
2017-10-05 19:02:28 8160 1 Command: OPTS UTF8 ON
2017-10-05 19:02:28 8160 1 Response: 200 UTF8 set to on
2017-10-05 19:02:28 8160 1 Command: PBSZ 0
2017-10-05 19:02:28 8160 1 Response: 200 PBSZ 0 successful
2017-10-05 19:02:28 8160 1 Command: PROT P
2017-10-05 19:02:28 8160 1 Response: 200 Protection set to Private
2017-10-05 19:02:28 8160 1 Status: Logged in
2017-10-05 19:02:28 8160 1 Status: Retrieving directory listing...
2017-10-05 19:02:28 8160 1 Command: PWD
2017-10-05 19:02:28 8160 1 Response: 257 "/" is the current directory
2017-10-05 19:02:28 8160 1 Command: TYPE I
2017-10-05 19:02:28 8160 1 Response: 200 Type set to I
2017-10-05 19:02:28 8160 1 Command: PASV
2017-10-05 19:02:28 8160 1 Response: 227 Entering Passive Mode (xx,xx,xx,xx,xx,xx).
2017-10-05 19:02:28 8160 1 Command: MLSD
2017-10-05 19:02:28 8160 1 Response: 150 Opening BINARY mode data connection for MLSD
2017-10-05 19:02:29 8160 1 Response: 226 Transfer complete
2017-10-05 19:02:29 8160 1 Status: Directory listing of "/" successful
2017-10-05 19:02:36 8160 3 Status: Resolving address of server.com
2017-10-05 19:02:36 8160 3 Status: Connecting to serverIp...
2017-10-05 19:02:36 8160 3 Status: Connection established, waiting for welcome message...
2017-10-05 19:02:36 8160 3 Response: 220 FTP on server.com ready
2017-10-05 19:02:36 8160 3 Command: AUTH TLS
2017-10-05 19:02:36 8160 3 Response: 234 AUTH TLS successful
2017-10-05 19:02:36 8160 3 Status: Initializing TLS...
2017-10-05 19:02:36 8160 3 Status: Verifying certificate...
2017-10-05 19:02:36 8160 3 Status: TLS connection established.
2017-10-05 19:02:36 8160 3 Command: USER user
2017-10-05 19:02:36 8160 3 Response: 331 Password required for user
2017-10-05 19:02:36 8160 3 Command: PASS ************
2017-10-05 19:02:36 8160 3 Response: 230 User user logged in
2017-10-05 19:02:36 8160 3 Command: OPTS UTF8 ON
2017-10-05 19:02:36 8160 3 Response: 200 UTF8 set to on
2017-10-05 19:02:36 8160 3 Command: PBSZ 0
2017-10-05 19:02:36 8160 3 Response: 200 PBSZ 0 successful
2017-10-05 19:02:36 8160 3 Command: PROT P
2017-10-05 19:02:36 8160 3 Response: 200 Protection set to Private
2017-10-05 19:02:36 8160 3 Status: Logged in
2017-10-05 19:02:36 8160 3 Status: Starting upload of C:\Users\User1\Pictures\test_sig.jpg
2017-10-05 19:02:36 8160 3 Command: CWD /folder
2017-10-05 19:02:36 8160 3 Response: 250 CWD command successful
2017-10-05 19:02:36 8160 3 Command: PWD
2017-10-05 19:02:36 8160 3 Response: 257 "/folder" is the current directory
2017-10-05 19:02:36 8160 3 Command: TYPE I
2017-10-05 19:02:36 8160 3 Response: 200 Type set to I
2017-10-05 19:02:36 8160 3 Command: PASV
2017-10-05 19:02:36 8160 3 Response: 227 Entering Passive Mode (xx,xx,xx,xx,xx,xx).
2017-10-05 19:02:36 8160 3 Command: STOR test_sig.jpg
2017-10-05 19:02:37 8160 3 Response: 150 Opening BINARY mode data connection for test_sig.jpg
2017-10-05 19:02:38 8160 3 Response: 226 Transfer complete
2017-10-05 19:02:38 8160 3 Status: File transfer successful, transferred 1.728.438 bytes in 1 second
2017-10-05 19:02:38 8160 3 Status: Retrieving directory listing of "/folder"...
2017-10-05 19:02:38 8160 3 Command: PASV
2017-10-05 19:02:38 8160 3 Response: 227 Entering Passive Mode (xx,xx,xx,xx,xx,xx).
2017-10-05 19:02:38 8160 3 Command: MLSD
2017-10-05 19:02:38 8160 3 Response: 150 Opening BINARY mode data connection for MLSD
2017-10-05 19:02:38 8160 3 Response: 226 Transfer complete
2017-10-05 19:02:38 8160 3 Status: Directory listing of "/folder" successful

I fixed the Problem. It was a copy and past fail in the FtpDataHandler. I set the this.serverDirectory equals serverAdress. So the Ftp Client could not find the directory on the server.

Here is the code snippit:

public FtpDataHandler(String serverAdress, String userName, String password, String serverDiretory) {
    this.serverAdress = serverAdress;
    this.userName = userName;
    this.password = password;
    //this was my problem. I set the serverAdress to the serverDirectory insted the serverDirectory
    //this.serverDirectory = serverAdress;
    this.serverDirectory = serverDirectory;

    connect();
}  

I also fixed it in the question, so that it's easier to find the full solution.

Thanks to @Martin Prikryl for the support.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM