将文件从Android应用程序上传到SFTP服务器

时间:2014-04-19 23:30:34

标签: java android sftp jsch

我的Android应用程序正在尝试将文件上传到SFTP Web服务器,这恰好是我的大学服务器的子域,我有权使用服务器空间的某些部分。我正在使用JSch库。我已将权限设置为777到根文件夹和WWW文件夹。这是一个截图:

以下是我的Android活动中的SFTP代码:

public class SFTPConnection extends AsyncTask<Void,Void,Void>
{

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        boolean conStatus = false;
        Session session = null;
        Channel channel = null;
        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");

        Log.i("Session","is"+conStatus);
        try {
            JSch ssh = new JSch();
            session = ssh.getSession("pmody", HOST_ADDRESS, 22);
            session.setPassword("667758482");
            session.setConfig(config);
            session.connect();
             conStatus = session.isConnected();
            Log.i("Session","is"+conStatus);
            channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftp = (ChannelSftp) channel;
            sftp.put("/sdcard/MyCameraApp/IMG_20140206_212035.jpg", "/");
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.i("Session","is"+conStatus);
        } catch (SftpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.i("Session","is"+conStatus);
        }
        return null;
    }

}

我得到以下Logcat:

 3: Permission denied
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp._put(ChannelSftp.java:594)
at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:475)
at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:365)
at com.example.locationtest.MainActivity$SFTPConnection.doInBackground(MainActivity.java:351)
at com.example.locationtest.MainActivity$SFTPConnection.doInBackground(MainActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)

另外,我已经在清单中给予了从外部存储读取和写入的权限。 允许拒绝的可能原因是什么?

3 个答案:

答案 0 :(得分:1)

这可能是路径问题。

当您登录时,您经常会进入一个您没有写入权限的默认目录。

如果是这种情况,您需要在放置文件之前cd到具有写入权限的正确目录,或者将文件放在完整路径中。

答案 1 :(得分:0)

您是否允许清单中的INTERNET权限?

<uses-permission android:name="android.permission.INTERNET" /> 

我遇到了与ssh返回相同的问题&#34;许可被拒绝&#34;这是因为应用程序本身不允许上网。

答案 2 :(得分:0)

实际上你的代码效果很好。我们的一个小编辑为我们工作(当然主持人和密码)。

分享我们做的不同。我们将文件名列表作为数组传递。或者你可以单独做到。

String appFilePath = Environment.getExternalStorageDirectory().toString() + "/MyCameraApp";
ArrayList<String> files_to_upload = getFileNames(GetFiles(appFilePath));


File exportFile = new File(root, files_to_upload[0].get(iFile));  //This should be your example -> IMG_20140206_212035.jpg

boolean conStatus = false;
Session session = null;
.... your code above
//sftp.put("/sdcard/MyCameraApp/IMG_20140206_212035.jpg", "/");
sftp.put(new FileInputStream(exportFile), exportFile.getName());