ftp與sftp上傳工具類

1、ftp上傳工具類

package com.zhjg.utils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.List;
import java.util.Properties;
import java.util.UUID;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.web.multipart.MultipartFile;
/**
 * 當端口號爲21時使用FTP
 * 
 * 配置文件示例:
 * sftp.host = IP
 * sftp.username = username
 * sftp.password = password
 * sftp.port = 21
 * sftp.path = /directory/...
 * 
 * @author zhjg
 *
 */
public class FTPUtils {

	// ftp配置放在屬性文件中
	private static Properties ftpConfig;

	static {
		ftpConfig = new Properties();
		try {
			ftpConfig.load(FTPUtils.class.getClassLoader()
					.getResourceAsStream("ftp.properties"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * springmvc文件上傳
	 * 
	 * @param file
	 * @return 保存在服務器的文件名
	 */
	public static String uploadFile(MultipartFile file) {
		String filename = null;
		try {
			filename = uploadFile(file.getOriginalFilename(),
					file.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		return filename;
	}

	/**
	 * 通用文件上傳
	 * 
	 * @param originalFilename
	 * @param is
	 * @return 保存在服務器的文件名
	 */
	public static String uploadFile(String originalFilename, InputStream is) {
		String filename = generateFileUUIDName(originalFilename);
		FTPClient ftpClient = null;
		try {
			ftpClient = connect();
			//以二進制的形式上傳,文件不會被改動
			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
			ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
			ftpClient.storeFile(filename, is);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		closeClient(ftpClient);
		return filename;
	}

	/**
	 * 下載文件 將指定要下載的文件解析到指定的輸出流對象 並返回服務器上保存的文件的文件名(帶有擴展名)
	 * 參數中的filename是前端傳遞的參數(沒有擴展名)
	 * 
	 * @param filename
	 * @param os
	 * @return 保存在服務器的文件名
	 */
	public static String downFile(String filename, OutputStream os) {
		FTPClient ftpClient = null;
		try {
			ftpClient = connect();
			//以二進制的形式下載,文件不會被改動
			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
			ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
			FTPFile[] ftpFiles = ftpClient.listFiles();
			for (FTPFile file : ftpFiles) {
				if (file.getName().contains(filename)) {
					filename = file.getName();
					ftpClient.retrieveFile(filename, os);
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		closeClient(ftpClient);
		return filename;
	}

	/**
	 * 刪除ftp上不在列表中的文件:
	 * 文件記錄會存放在數據庫中,當數據庫中記錄刪除時, ftp服務器上對應的文件也要刪除
	 * 
	 * @param filenames
	 * @return true:成功;false:失敗
	 */
	public static boolean deleteFiles(List<String> filenames) {
		FTPClient ftpClient = null;
		try {
			ftpClient = connect();
			// 獲取ftp當前目錄的文件列表
			FTPFile[] ftpFiles = ftpClient.listFiles();
			// 刪除標記位
			boolean isDelete = true;
			for (FTPFile file : ftpFiles) {
				isDelete = true;
				for (String filename : filenames) {
					if (filename.equalsIgnoreCase(file.getName())) {
						isDelete = false;
					}
				}
				if (isDelete) {
					ftpClient.deleteFile(file.getName());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		closeClient(ftpClient);
		return true;
	}

	/**
	 * 連接FTP服務器 返回連接對象 若使用對象池來維護,可在此方法中borrow連接
	 * 
	 * @return
	 * @throws IOException
	 * @throws SocketException
	 */
	public static FTPClient connect() throws SocketException, IOException {

		String host = ftpConfig.getProperty("ftp.host");
		int port = Integer.parseInt(ftpConfig.getProperty("ftp.port"));
		String username = ftpConfig.getProperty("ftp.username");
		String password = ftpConfig.getProperty("ftp.password");
		String path = ftpConfig.getProperty("ftp.path");
		FTPClient ftpClient = new FTPClient();
		ftpClient.connect(host, port);
		ftpClient.login(username, password);
		int replyCode = ftpClient.getReplyCode();
		if (!FTPReply.isPositiveCompletion(replyCode)) {
			return null;
		}
		// 切換到path指定的目錄
		ftpClient.changeWorkingDirectory(path);
		return ftpClient;
	}

	/**
	 * 退出登錄狀態 關閉連接
	 * 
	 * @param ftpClient
	 */
	public static void closeClient(FTPClient ftpClient) {
		try {
			if (ftpClient != null) {
				ftpClient.logout();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ftpClient != null && ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			}
		}
	}

	/**
	 * 生成保存在服務器上的文件名
	 * 
	 * @param originalFilename
	 * @return
	 */
	public static String generateFileUUIDName(String originalFilename) {
		return UUID.randomUUID().toString().replaceAll("-", "")
				+ originalFilename.substring(originalFilename.indexOf("."));
	}

}


2、sftp上傳工具類

package com.zhjg.utils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.UUID;
import java.util.Vector;

import org.springframework.web.multipart.MultipartFile;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
/**
 * 當端口號爲22時使用SFTP
 * 
 * 配置文件示例:
 * sftp.host = IP
 * sftp.username = username
 * sftp.password = password
 * sftp.port = 22
 * sftp.path = /directory/...
 * 
 * @author zhjg
 *
 */
public class SFTPUtils {

	// sftp配置放在屬性文件中
	private static Properties sftpConfig;

	static {
		sftpConfig = new Properties();
		try {
			//加載class根目錄下的sftp配置文件
			sftpConfig.load(SFTPUtils.class.getClassLoader()
					.getResourceAsStream("sftp.properties"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 獲取sftp連接
	 * 
	 * @return
	 * @throws JSchException
	 */
	public static ChannelSftp getChannel() throws JSchException {
		String host = sftpConfig.getProperty("sftp.host");
		int port = Integer.parseInt(sftpConfig.getProperty("sftp.port"));
		String username = sftpConfig.getProperty("sftp.username");
		JSch jsch = new JSch();
		Session session = jsch.getSession(username, host, port);
		Properties config = new Properties();
		config.put("StrictHostKeyChecking", "no");
		session.setConfig(config);
		session.setPassword(sftpConfig.getProperty("sftp.password"));
		session.connect();
		ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
		channel.connect();
		return channel;
	}

	public static void close(Channel channel) {
		Session session = null;
		if (channel != null) {
			session = channel.getSession();
			channel.disconnect();
			session.disconnect();
		}
	}

	/**
	 * springmvc文件上傳
	 * 
	 * @param file
	 * @return
	 * @throws IOException
	 * @throws SftpException
	 * @throws JSchException
	 */
	public static String uploadFile(MultipartFile file) {
		InputStream is = null;
		try {
			is = file.getInputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return uploadFile(file.getOriginalFilename(), is);
	}

	/**
	 * 文件上傳
	 * 
	 * @param originalFilename
	 *            :本地文件名
	 * @param is
	 *            :上傳文件流
	 * @return filename:保存在服務器上的文件名
	 * @throws JSchException
	 * @throws SftpException
	 */
	public static String uploadFile(String originalFilename, InputStream is) {
		return uploadFile(originalFilename, is,
				sftpConfig.getProperty("sftp.path"));
	}

	/**
	 * 文件上傳
	 * 
	 * @param originalFilename
	 *            :本地文件名
	 * @param is
	 *            :上傳文件流
	 * @param path
	 *            :文件保存路徑
	 * @return filename:保存在服務器上的文件名
	 * @throws JSchException
	 * @throws SftpException
	 */
	public static String uploadFile(String originalFilename, InputStream is,
			String path) {
		ChannelSftp channel = null;
		String filename = generateFileUUIDName(originalFilename);
		try {
			channel = getChannel();
			channel._put(is, path + filename, null, 0);
		} catch (JSchException e) {
			e.printStackTrace();
		} catch (SftpException e) {
			e.printStackTrace();
		}
		close(channel);
		return filename;
	}

	/**
	 * 文件下載
	 * 
	 * @param filename
	 *            :待下載的文件名(沒有擴展名)
	 * @param os
	 *            :響應的輸出流
	 * @return filename :待下載的文件名(擴展名)
	 * @throws JSchException
	 * @throws SftpException
	 */
	public static String downFile(String filename, OutputStream os) {
		return downFile(filename, os, sftpConfig.getProperty("sftp.path"));
	}

	/**
	 * 文件下載
	 * 
	 * @param filename
	 *            :待下載的文件名(沒有擴展名)
	 * @param os
	 *            :響應的輸出流
	 * @return filename :待下載的文件名(擴展名)
	 * @throws SftpException
	 * @throws JSchException
	 */
	@SuppressWarnings("rawtypes")
	public static String downFile(String filename, OutputStream os, String path) {
		ChannelSftp channel = null;
		try {
			channel = getChannel();
			Vector ls = channel.ls(path);
			if (ls != null && ls.size() > 0) {
				for (int i = 0; i < ls.size(); i++) {
					LsEntry entry = (LsEntry) ls.get(i);
					if (entry.getFilename().contains(filename)) {
						filename = entry.getFilename();
						channel.get(path + filename, os, null);
						close(channel);
						return filename;
					}
				}
			}
		} catch (SftpException e) {
			e.printStackTrace();
		} catch (JSchException e) {
			e.printStackTrace();
		}
		close(channel);
		return null;
	}

	/**
	 * 生成保存在服務器上的文件名
	 * 
	 * @param originalFilename
	 * @return
	 */
	public static String generateFileUUIDName(String originalFilename) {
		return UUID.randomUUID().toString().replaceAll("-", "")
				+ originalFilename.substring(originalFilename.indexOf("."));
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章