JAVAファイルアップロードFTPリモートサーバー

2538 ワード

方法1:文字列ファイルストリームがローカルファイルを生成しない
FTPClient ftpClient = new FTPClient();
		try {
			InputStream is = null;
			// 1.   
			is = new ByteArrayInputStream(fileContent.getBytes());  //    
			// 2.     
			ftpClient.connect(server);
			// 3.  ftp
			ftpClient.login(userName, userPassword);
			// 4.       
			ftpClient.changeWorkingDirectory(remotePath); //          
			// 5.   
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //    
			ftpClient.enterLocalPassiveMode();
			ftpClient.storeFile(new String(fileName.getBytes("utf-8"),"iso-8859-1"), is);
			is.close();
		} catch (Exception e) {
			result = false;
		} finally {
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (Exception e) {
					result = false;
				}
			}
		}

FTPClient.enterLocalPassiveMode();この方法は、データ接続のたびにftpクライアントがftp serverにデータを転送するためのポートを開設するように伝えることを意味します.なぜそうするのかというと、ftp serverは異なるポートを開くたびにデータを転送する可能性がありますが、linuxではセキュリティ制限のため、一部のポートが開いていないため、ブロックが発生する可能性があります.Q:FTPClientでftp.storeFile(file Name,inputFile)に実行する.反応しなくなった
A: ftpclient.enterLocalPassiveMode();
ftp.storeFile(fileName, inputFile);問題解決
なぜなら、FTPプロトコルにはPORT方式とPASV方式の2つの働き方があり、中国語ではアクティブ式と受動式を意味する.PORT(アクティブ)方式の接続プロセスは、クライアントがサーバのFTPポート(デフォルトは21)に接続要求を送信し、サーバが接続を受け入れ、コマンドリンクを確立することである.データを転送する必要がある場合、クライアントはコマンドリンク上でPORTコマンドでサーバーに「XXXXポートを開いたので、接続してください」と伝えます.そこで、サーバーは20ポートからクライアントのXXXXポートに接続要求を送信し、データリンクを確立してデータを転送する.PASV(パッシブ)方式の接続プロセスは、クライアントがサーバのFTPポート(デフォルトは21)に接続要求を送信し、サーバが接続を受け入れ、コマンドリンクを確立することである.データを転送する必要がある場合、サーバはコマンドリンク上でPASVコマンドでクライアントに「XXXXポートを開いたので、接続してください」と伝えます.そこでクライアントはサーバのXXXXポートに接続要求を送信し、データリンクを確立してデータを転送する.方法2:ローカルファイルをリモートサーバにアップロードする
public void uploadFile(String remotePath, String localPath, String fileNames)
			throws Exception {
		if (connectServer()) {
			logger.info("  [" + localPath + "]SFTP   [" + remotePath + "]");

			OutputStream outstream = null;
			InputStream instream = null;
			try {
				instream = new FileInputStream(new File(localPath + fileNames));
				outstream = this.channel.put(remotePath + fileNames);

				byte[] b = new byte[1024];
				int n;
				while ((n = instream.read(b)) != -1) {
					outstream.write(b, 0, n);
				}
				outstream.flush();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				closeServer();
			}
			logger.info("  [" + localPath + "]SFTP   [" + remotePath + "]");
		} else {
			throw new Exception("SFTP    ");
		}
	}