JavaはFTPファイルのアップロードを実現します。
一、FTPファイルサーバの設定
Ubuntuを例にして
FTPの2種類のモードの簡単な紹介
PORT(アクティブモード)
第1のステップFTPクライアントは、まず、1024より大きいポートp 1をランダムに選択し、このポート送信要求を介してFTPサーバの21番目のポートに接続してTCP接続を確立し、FTPではこの接続を制御接続といい、接続が成功したら、FTPクライアントは、ポートポートポートポートを送信し、FTPクライアントは、自分のp 1+1ポートを監視します。FTPサーバは、ポートポートポート20からFTPクライアントのp 1+1ポートに対して、データを送信するためのTCP接続と呼ばれる接続を開始します。データ転送が完了すると、データ接続が終了し、制御接続がオープンします。
Passive(受動モード)
制御接続を確立するときはアクティブモードと似ていますが、接続を確立した後に送信されるのはポートコマンドではなく、Pasvコマンドです。FTPサーバは、Pasvコマンドを受信した後、ランダムに一時ポートを開きます。(自由ポートともいいます。ポート番号は1023より65535未満です。)、このポートでデータを転送する要求をクライアントに通知します。FTPクライアントは、FTPサーバに接続することを要求するポートを送信します。接続の確立に成功したFTPサーバは、このポートを通じてデータの転送データを転送した後、データ接続をすぐにオフにし、制御コネクションをオンにします。
注!!!多くのファイアウォールは設定時に外部からの接続を許可しないので、ファイアウォールの後やイントラネットの後にあるFTPクライアントはアクティブモードをサポートしていません。サーバーがファイアウォールを通過できないか、またはNAT後のクライアントに接続できないためです。だからファイルをアップロードする時はパッシブモードを開く必要があります!!!
1、vsftpdをインストールする
(1)、コア配置
write_enable=YES放せばいいです。
このパッシブモードで一日やっていますが、いつも写真が届かなくて、伝わっても0 kbしかないです。原因がまだ分かりません。えっと、
3、起動サービスを再開する
二、javaファイルをFTPにアップロードする
簡単なファイルをアップロードします。
以上はJavaがFTPファイルのアップロードを実現した詳細です。Java FTPファイルのアップロードに関する資料は他の関連記事に注目してください。
Ubuntuを例にして
FTPの2種類のモードの簡単な紹介
PORT(アクティブモード)
第1のステップFTPクライアントは、まず、1024より大きいポートp 1をランダムに選択し、このポート送信要求を介してFTPサーバの21番目のポートに接続してTCP接続を確立し、FTPではこの接続を制御接続といい、接続が成功したら、FTPクライアントは、ポートポートポートポートを送信し、FTPクライアントは、自分のp 1+1ポートを監視します。FTPサーバは、ポートポートポート20からFTPクライアントのp 1+1ポートに対して、データを送信するためのTCP接続と呼ばれる接続を開始します。データ転送が完了すると、データ接続が終了し、制御接続がオープンします。
Passive(受動モード)
制御接続を確立するときはアクティブモードと似ていますが、接続を確立した後に送信されるのはポートコマンドではなく、Pasvコマンドです。FTPサーバは、Pasvコマンドを受信した後、ランダムに一時ポートを開きます。(自由ポートともいいます。ポート番号は1023より65535未満です。)、このポートでデータを転送する要求をクライアントに通知します。FTPクライアントは、FTPサーバに接続することを要求するポートを送信します。接続の確立に成功したFTPサーバは、このポートを通じてデータの転送データを転送した後、データ接続をすぐにオフにし、制御コネクションをオンにします。
注!!!多くのファイアウォールは設定時に外部からの接続を許可しないので、ファイアウォールの後やイントラネットの後にあるFTPクライアントはアクティブモードをサポートしていません。サーバーがファイアウォールを通過できないか、またはNAT後のクライアントに接続できないためです。だからファイルをアップロードする時はパッシブモードを開く必要があります!!!
1、vsftpdをインストールする
apt-get install vsftpd
2、配置vs ftpdvi /etc/vsftpd.conf
以下はvsftpd配置の詳細です。(1)、コア配置
local_enable=YES //
write_enable=YES //
local_umask=022 // FTP , 077, 022
pam_service_name=vsftpd //
connect_from_port_20=YES // FTP
listen=yes // FTP
listen_port=23 //
(2)、匿名登録設定
anonymous_enable=NO // ,
anon_upload_enable=YES // ,
anon_mkdir_write_enable=YES // ,
anon_other_write_enable=yes // ,
anon_world_readable_only=no // , , Other, /
anon_max_rate=30000 // , , bite
(3)、ログイン制限
userlist_enable=yes // userlist
userlist_deny=no //
userlist_file=/etc/vsftpd/userlist_deny.chroot //
(4)、制限ディレクトリ
chroot_local_user=yes //
chroot_list_enable=YES //
chroot_list_file=/etc/vsftpd/chroot_list //
(5)、ログ設定
xferlog_file=/var/log/vsftpd.log //
xferlog_std_format=YES //
(6)、安全設定
idle_session_timeout=600 // ,
data_connection_timeout=120 // ,
accept_timeout=60 // 1
local_max_rate=10000 // , bite
max_clients=100 //FTP
max_per_ip= 3 // IP
(7)、受動モード設定
pasv_enable=yes //
pasv_min_port=3000 //
pasv_max_port=5000 //
実は一部を配置すればファイルをアップロードできます。write_enable=YES放せばいいです。
このパッシブモードで一日やっていますが、いつも写真が届かなくて、伝わっても0 kbしかないです。原因がまだ分かりません。えっと、
3、起動サービスを再開する
service vsftpd restart
4、ログイン二、javaファイルをFTPにアップロードする
簡単なファイルをアップロードします。
/**
* Description: FTP
* @param host FTP hostname
* @param port FTP
* @param username FTP
* @param password FTP
* @param basePath FTP
* @param filePath FTP 。 :/2018/01/01。 basePath+filePath
* @param filename FTP
* @param input
* @return true, false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
// FTP // , ftp.connect(host) FTP
ftp.connect(host, port);
//
ftp.login(username, password);
reply = ftp.getReplyCode(); //
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect(); //
return result; //
}
//
ftp.enterLocalPassiveMode();
//
if (!ftp.changeWorkingDirectory(basePath+filePath)) {
//
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir)) continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// true false
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
/**
* Description: FTP
* @param host FTP hostname
* @param port FTP
* @param username FTP
* @param password FTP
* @param remotePath FTP
* @param fileName
* @param localPath
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false;
//
FTPClient ftp = new FTPClient();
try {
int reply;
// // , ftp.connect(host) FTP
ftp.connect(host, port);
//
ftp.login(username, password);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
//
ftp.enterLocalPassiveMode();
ftp.changeWorkingDirectory(remotePath);// FTP
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
テストクラス
InputStream inputStream = new FileInputStream(new File("D:/mine/x.jpg"));
//uuid uuid
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
FTPTools.uploadFile("192.168.1.242",21,"q","q","/home/q/","/",uuid+" ",inputStream);
Apacheの原生ftp。。。。ftpに接続していますが、ファイルのアップロードが成功していません。十中八九Vsftpdの配置に問題があります。以上はJavaがFTPファイルのアップロードを実現した詳細です。Java FTPファイルのアップロードに関する資料は他の関連記事に注目してください。