以下內容轉自:
https://www.cnblogs.com/weihbs/p/7760552.html
Java 實現ftp 文件上傳、下載和刪除
本文利用apache ftp工具實現文件的上傳下載和刪除。具體如下:
1、下載相應的jar包
commons-net-1.4.1.jar
2、實現代碼如下:
public class FtpUtils {
//ftp服務器地址
public String hostname = "192.168.1.249";
//ftp服務器端口號默認為21
public Integer port = 21 ;
//ftp登錄賬號
public String username = "root";
//ftp登錄密碼
public String password = "123";
public FTPClient ftpClient = null;
/**
* 初始化ftp服務器
*/
public void initFtpClient() {
ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
try {
System.out.println("connecting...ftp服務器:"+this.hostname+":"+this.port);
ftpClient.connect(hostname, port); //連接ftp服務器
ftpClient.login(username, password); //登錄ftp服務器
int replyCode = ftpClient.getReplyCode(); //是否成功登錄服務器
if(!FTPReply.isPositiveCompletion(replyCode)){
System.out.println("connect failed...ftp服務器:"+this.hostname+":"+this.port);
}
System.out.println("connect successfu...ftp服務器:"+this.hostname+":"+this.port);
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 上傳文件
* @param pathname ftp服務保存地址
* @param fileName 上傳到ftp的文件名
* @param originfilename 待上傳文件的名稱(絕對地址) *
* @return
*/
public boolean uploadFile( String pathname, String fileName,String originfilename){
boolean flag = false;
InputStream inputStream = null;
try{
System.out.println("開始上傳文件");
inputStream = new FileInputStream(new File(originfilename));
initFtpClient();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
System.out.println("上傳文件成功");
}catch (Exception e) {
System.out.println("上傳文件失敗");
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
* 上傳文件
* @param pathname ftp服務保存地址
* @param fileName 上傳到ftp的文件名
* @param inputStream 輸入文件流
* @return
*/
public boolean uploadFile( String pathname, String fileName,InputStream inputStream){
boolean flag = false;
try{
System.out.println("開始上傳文件");
initFtpClient();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
System.out.println("上傳文件成功");
}catch (Exception e) {
System.out.println("上傳文件失敗");
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
//改變目錄路徑
public boolean changeWorkingDirectory(String directory) {
boolean flag = true;
try {
flag = ftpClient.changeWorkingDirectory(directory);
if (flag) {
System.out.println("進入文件夾" + directory + " 成功!");
} else {
System.out.println("進入文件夾" + directory + " 失敗!開始創建文件夾");
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
return flag;
}
//創建多層目錄文件,如果有ftp服務器已存在該文件,則不創建,如果無,則創建
public boolean CreateDirecroty(String remote) throws IOException {
boolean success = true;
String directory = remote + "/";
// 如果遠程目錄不存在,則遞歸創建遠程服務器目錄
if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) {
int start = 0;
int end = 0;
if (directory.startsWith("/")) {
start = 1;
} else {
start = 0;
}
end = directory.indexOf("/", start);
String path = "";
String paths = "";
while (true) {
String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");
path = path + "/" + subDirectory;
if (!existFile(path)) {
if (makeDirectory(subDirectory)) {
changeWorkingDirectory(subDirectory);
} else {
System.out.println("創建目錄[" + subDirectory + "]失敗");
changeWorkingDirectory(subDirectory);
}
} else {
changeWorkingDirectory(subDirectory);
}
paths = paths + "/" + subDirectory;
start = end + 1;
end = directory.indexOf("/", start);
// 檢查所有目錄是否創建完畢
if (end <= start) {
break;
}
}
}
return success;
}
//判斷ftp服務器文件是否存在
public boolean existFile(String path) throws IOException {
boolean flag = false;
FTPFile[] ftpFileArr = ftpClient.listFiles(path);
if (ftpFileArr.length > 0) {
flag = true;
}
return flag;
}
//創建目錄
public boolean makeDirectory(String dir) {
boolean flag = true;
try {
flag = ftpClient.makeDirectory(dir);
if (flag) {
System.out.println("創建文件夾" + dir + " 成功!");
} else {
System.out.println("創建文件夾" + dir + " 失敗!");
}
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/** * 下載文件 *
* @param pathname FTP服務器文件目錄 *
* @param filename 文件名稱 *
* @param localpath 下載后的文件路徑 *
* @return */
public boolean downloadFile(String pathname, String filename, String localpath){
boolean flag = false;
OutputStream os=null;
try {
System.out.println("開始下載文件");
initFtpClient();
//切換FTP目錄
ftpClient.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
File localFile = new File(localpath + "/" + file.getName());
os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag = true;
System.out.println("下載文件成功");
} catch (Exception e) {
System.out.println("下載文件失敗");
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != os){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/** * 刪除文件 *
* @param pathname FTP服務器保存目錄 *
* @param filename 要刪除的文件名稱 *
* @return */
public boolean deleteFile(String pathname, String filename){
boolean flag = false;
try {
System.out.println("開始刪除文件");
initFtpClient();
//切換FTP目錄
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
System.out.println("刪除文件成功");
} catch (Exception e) {
System.out.println("刪除文件失敗");
e.printStackTrace();
} finally {
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
return flag;
}
public static void main(String[] args) {
FtpUtils ftp =new FtpUtils();
//ftp.uploadFile("ftpFile/data", "123.docx", "E://123.docx");
//ftp.downloadFile("ftpFile/data", "123.docx", "F://");
ftp.deleteFile("ftpFile/data", "123.docx");
System.out.println("ok");
}
}
很好,的確可以使用。不知道作者使用的JDK是哪個版本的,我用的JDK1.6,會報錯,應該是commons-net-1.4.1.jar這個包不支持JDK1.6,我把commons-net-1.4.1.jar替換成了commons-net-3.1.jar,就可以了。而且只要把downloadFile方法里面的if判斷去掉就能實現批量下載,完美!!!
以下內容轉自:https://www.cnblogs.com/forever2h/p/6861646.html
ftp 之 使用java將文件上傳到ftp服務器上
1. 在實際的應用重,通常是通過程序來進行文件的上傳。
2. 實現java上傳文件到ftp服務器中
- 新建maven項目
- 添加依賴
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency> - 測試:
@Test public void testFtp1(){ //創建客戶端對象 FTPClient ftp = new FTPClient(); InputStream local=null; try { //連接ftp服務器 ftp.connect("192.168.80.161", 21); //登錄 ftp.login("ftpuser", "1111"); //設置上傳路徑 String path="/home/ftpuser/image"; //檢查上傳路徑是否存在 如果不存在返回false boolean flag = ftp.changeWorkingDirectory(path); if(!flag){ //創建上傳的路徑 該方法只能創建一級目錄,在這里如果/home/ftpuser存在則可創建image ftp.makeDirectory(path); } //指定上傳路徑 ftp.changeWorkingDirectory(path); //指定上傳文件的類型 二進制文件 ftp.setFileType(FTP.BINARY_FILE_TYPE); //讀取本地文件 File file = new File("mm.jpg"); local = new FileInputStream(file); //第一個參數是文件名 ftp.storeFile(file.getName(), local); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { //關閉文件流 local.close(); //退出 ftp.logout(); //斷開連接 ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } }
3. 優化java上傳代碼:
如何解決上傳的圖片重名的問題?如果不解決,那么上傳相同名稱的圖片將會覆蓋之前文件。
可以通過重寫設置圖片名稱來,即將圖片名為uuid的名稱。
//生成上傳文件的名稱
public static String getFileName(String primitiveFileName){
//使用uuid生成文件名
String fileName=UUID.randomUUID().toString();
//獲取文件后綴
String suffix=primitiveFileName.substring(primitiveFileName.lastIndexOf("."));
return fileName+suffix;
}
2. 當每天上傳的圖片很多時,如何管理這些圖片?
通常會根據年份,月份,日期,來創建目錄來存放數據。
//設置上傳路徑
String basePath="/home/ftpuser/image/";
Date currentDate = new Date();
String dateStr=new SimpleDateFormat("yyyy/MM/dd").format(currentDate);
for(String pathStr:dateStr.split("/")){
basePath+=pathStr+"/";
boolean flag = ftp.changeWorkingDirectory(basePath);
if(!flag){
//創建上傳的路徑 該方法只能創建一級目錄,在這里如果/home/ftpuser存在則可創建image
ftp.makeDirectory(basePath);
}
}
//指定上傳路徑
ftp.changeWorkingDirectory(basePath);

