我的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)
另外,我已经在清单中给予了从外部存储读取和写入的权限。 允许拒绝的可能原因是什么?
答案 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());