Apache FTPClient не поддерживает SFTP на данный момент. Тем не менее, вы можете использовать JSch-Java Secure Channel.
Onkar Joshi более подробно описывает библиотеку, используемую для FTP, SFTP, передачи файлов FTPS в Java.
Пример использования JSch для передачи файлов с SFTP выглядит следующим образом:
...
private static final Logger logger = Logger.getLogger(YourClass.class.getName());
public boolean sendDataViaSFTP(String contents) throws Exception {
String hostname = "";
String username = "";
String password = "";
String remoteDirectory = "";
int ftpPort = 22;
logger.info("*** Creating FTP session. ***");
JSch jsch = new JSch();
Session session = null;
Channel channel = null;
ChannelSftp c = null;
//Now connect and SFTP to the SFTP Server
try {
//Create a session sending through our username and password
session = jsch.getSession(username, hostname, ftpPort);
logger.info("*** FTP Session created. ***");
session.setPassword(password);
//Security.addProvider(new com.sun.crypto.provider.SunJCE());
//Setup Strict HostKeyChecking to no so we dont get the
//unknown host key exception
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
logger.info("*** Session connected. ***");
//Open the SFTP channel
logger.info("*** Opening FTP Channel. ***");
channel = session.openChannel("sftp");
channel.connect();
c = (ChannelSftp) channel;
//Change to the remote directory
logger.info("*** Changing to FTP remote dir: " + remoteDirectory + " ***");
c.cd(remoteDirectory);
//Send the file we generated
try {
String filename = "myfile.txt";
logger.info("*** Storing file as remote filename: " + filename + " ***");
ByteArrayInputStream bis = new ByteArrayInputStream(contents.getBytes());
c.put(bis, filename);
return true;
} catch (Exception e) {
logger.info("*** Storing remote file failed. " + e.toString() + " ***");
throw e;
}
} catch (Exception e) {
logger.info("*** Unable to connect to FTP server. " + e.toString() + " ***");
throw e;
} finally {
//
//Disconnect from the FTP server
//
try {
if(session != null)
session.disconnect();
if(channel != null)
channel.disconnect();
if(c != null)
c.quit();
} catch (Exception exc) {
logger.severe("*** Unable to disconnect from FTP server. " + exc.toString()+" ***");
}
logger.info("*** SFTP Process Complete. ***");
}
}
...
Единственный способ воспроизвести вашу ошибку - это создать код непосредственно в оболочке IDLE и закрыть всплывающее корневое окно перед созданием кнопки.
Тем не менее, очень странно писать GUI в командной консоли следующим образом. Если вы не закрываете окно tkinter, код работает нормально. Однако разработку GUI следует выполнять в редакторе в файле .py
и запускать сразу. Простое решение состоит в том, чтобы не закрывать корневое окно, пока все остальное в графическом интерфейсе не было добавлено.
Надлежащее решение - построить графический интерфейс в файле .py
, а затем запустить его.
Я не уверен, почему вы говорите, что редактор не работает для вас. Когда я копирую ваш точный код, он прекрасно работает с моей стороны:
Все, что говорит, что вам действительно не нужно создавать свой код в Python IDLE. Было бы намного лучше использовать что-то вроде PyCharm или Eclipse / PyDev. Это мои инструменты Go to IDE.
Стоит отметить, что в Python IDLE не будет запускать код из редактора, пока вы не сохраните файл .py
.
Хотя в Python IDLE не требуется 100%, mainloop()
является обязательным требованием для корректной работы tkinter. Вне Python IDLE большинство других сред IDE требуют mainloop()
, поэтому рекомендуется всегда включать его.
import tkinter as tk
root = tk.Tk()
b = tk.Button(root, text='button')
b.pack()
root.mainloop()
Я думаю, вы забыли добавить root.mainloop()
в конце.
import tkinter as tk
root = tk.Tk()
b = tk.Button(root, text='button'); b.pack()
root.mainloop()