基于Ftp/Sftp协议的文件服务器数据传输

在项目中将应用服务器和文件服务器分开,能够增加项目的可维护性。本例分别使用FTP协议和SFTP协议在Windows Server 2008和Linux系统实现对文件的上传、下载和删除操作。

服务接口如下:

public interface FileManageDao {
	/**
	 * 上传文件
	 * @param inputStream:文件输入流
	 * @param fileName:上传文件名称
	 */
	public void upload(InputStream inputStream,String directory,String fileName) ;
	/**
	 * 下载文件
	 * @param outputStream:文件输出流
	 * @param fileName:下载文件名称
	 */
	public void download(OutputStream outputStream,String directory,String fileName) ;
	/**
	 * 获取文件的输入流
	 * @param directory
	 * @param fileName
	 * @return
	 */
	public InputStream getAttachmentFile(String directory,String fileName);
	/**
	 * 根据文档全名删除文件
	 * @param fileName
	 */
	public void delete(String directory,String fileName) ;
        /**
	 * 判断文件是否存在
	 * @param directory
	 * @param fileName
	 * @return
	 */
	public boolean isExist(String directory,String fileName) ;
}

服务接口模板类:

public abstract class FileManageDaoTemplate implements FileManageDao {
	//主机ip
    public String host="" ;
    //端口号,默认为22
    public int port = 22 ;
    //服务器用户名,默认为root
    public String userName="root" ;
    //服务器密码
    public String password ;
    //服务器上传地址
    public String targetBaseLocation = "chrhc" ;
    //服务器连接超时时间(ms),默认60000
    public int timeout = 60000;
	
	public void setTargetBaseLocation(String targetBaseLocation) {
		if(!StringUtils.hasLength(targetBaseLocation)){
			return ;
		}
		targetBaseLocation = StringUtils.trimLeadingCharacter(targetBaseLocation, '/') ;
		targetBaseLocation = StringUtils.trimTrailingCharacter(targetBaseLocation, '/') ;
		
		this.targetBaseLocation = targetBaseLocation ;
	}
      ....set and get method.....
}

 下面在不同的系统分别采用不同的方式实现:

1.Windows 2008 Server下FTP协议

在Windows下选择使用FTP协议的原因是FTP是Windows自带的服务,只需要通过配置开启FTP服务即可,不需要第三方的安装包。Windows 2008下FTP配置见附件。

使用第三方免费安装包freeftpd也可以实现Windows系统下的FTP、SSH和SFTP服务,但是需要在软件界面中做相应的配置。

JAR包:使用Apache的FTP开源组件commons-net,添加如下Maven依赖:

  <dependency>
      <groupId>commons-net</groupId>
      <artifactId>commons-net</artifactId>
      <version>3.3</version>
  </dependency>

 文件上传模板类实现: