JSP_FTP
来源:互联网 发布:mysql查询顺序 编辑:程序博客网 时间:2024/06/04 18:46
转自http://blog.csdn.net/rocket5725/article/details/4177090
感谢IT的前辈
时间:2009-05-13 14:23:19
内容:在JSP中实现FTP上传和下载
虽然已经实现了FTP上传,但是目前却只能上传英文路径,该问题依旧等待解决的方案
一、所需软件:
FTP服务器:ServUSetup.exe 下载地址为:http://www.rhinosoft.com/__release/ServUSetup.exe
Java FTP 库edtFTPj/Free:下载地址为:http://www.enterprisedt.com/products/edtftpj/download/edtftpj.zip
二、edtFTPj/Free实现了以下功能
1、上传指定文件夹(包括子文件和文件夹) uploadFolder(String folderName, String ftpPath)
2、下载FTP上指定的文件夹 downloadFolder(String ftppath, String outdir, String ftpdir)
3、上传指定文件夹下的所有文件到FTP指定目录下 uploadAllFilesInFolder(String folderName, String ftpPath)
4、删除指定文件夹下的所有文件(包括子文件夹里面的文件,但由于不知怎么删除目录,所以暂没有做删除目录的功能) deleteAllFilesInFolder(String ftppath, String ftpdir)
5、删除指定文件 String deleteFile(String ftpPath)
6、判断FTP上目录是否存在 isDirExist(String dirname, String[] files)
7、上传单个文件 uploadFile(String clientFileName, String ftpPath)
8、下载单个文件 downloadFile(String remoteFileName,String localFileName)
9、删除指定文件夹下的所有文件(不包括子文件夹,只是删除指定文件夹下的文件)
三、实现过程
0、安装FTP服务器,配置域名、用户名、密码以及根目录
1、连接FTP服务器
/**************************************************************************
调用该构造函数的格式为:FtpService ftp=new FtpService("127.0.0.1","21","admin","admin");
打印效果如下则表示连接服务器成功
开始登录
登录成功
已转入根目录
**************************************************************************/
- /**
- * 初始化连接
- * @param pFtpServer FTP服务器地址
- * @param pFtpPort FTP服务器端口
- * @param pFtpUserName FTP登录用户名
- * @param pFtpPassword FTP登录密码
- * @throws IOException
- */
- public FtpService(String pFtpServer, String pFtpPort, String pFtpUserName,String pFtpPassword) throws Exception
- {
- this.ftpServer = pFtpServer;
- if (pFtpPort.trim().equals(""))
- this.ftpPort = "21";
- else
- this.ftpPort = pFtpPort;
- if (pFtpUserName.trim().equals(""))
- this.ftpUserName = "Anonymous";
- else
- this.ftpUserName = pFtpUserName;
- this.ftpPassword = pFtpPassword;
- try {
- ftpClient = new FTPClient(); //ftpServer, Integer.parseInt(ftpPort)
- ftpClient.setRemoteHost(ftpServer);
- ftpClient.setRemotePort(Integer.parseInt(ftpPort));
- ftpClient.setControlEncoding("gbk"); //加上这一句后在 edtftpj 2.0.1 下就可以传中文文件名了
- System.out.println("开始登录");
- ftpClient.connect();
- ftpClient.login(ftpUserName, ftpPassword);
- System.out.println("登录成功");
- ftpClient.chdir("//"); //在有的ftp服务器运行会出错,用ftpClient.chdir("/")又可以了
- System.out.println("已转入根目录");
- isLogin = true;
- } catch (Exception e) {
- throw new Exception(e.getMessage());
- }
- }
2、实现上传文件函数:上传指定文件夹下的所有文件到FTP指定目录下
- /**
- * 上传指定文件夹下的所有文件到FTP指定目录下
- * @param folderName 本地要上传的文件夹全路径
- * @param ftpPath FTP上对于根目录的路径
- * @throws IOException
- */
- public void uploadAllFilesInFolder(String folderName, String ftpPath) throws
- Exception {
- if (isLogin) {
- String strMsg = "";
- try {
- File file = new File(folderName);
- if (file.isDirectory()) {
- ftpClient.chdir("//");
- ftpClient.setType(FTPTransferType.BINARY);
- if (checkFolderIsExist(ftpPath)) {
- ftpClient.chdir(ftpPath);
- } else {
- createFolder(ftpPath);
- }
- File[] files = file.listFiles();
- for (int i = 0; i < files.length; i++) {
- if (files[i].isFile()) {
- try {
- ftpClient.put(files[i].getPath(),
- files[i].getName());
- } catch (Exception ee) {
- strMsg += "upload file<<:" + files[i].getPath() +
- ">> error!Message:" + ee.getMessage() +
- "/r/n";
- }
- }
- }
- } else {
- throw new Exception(folderName + " is not a folder'name!");
- }
- } catch (Exception e) {
- throw new Exception(e.getMessage());
- }
- } else {
- throw new Exception("you didnot login remote ftp server!");
- }
- }
3、实现上传单个文件函数
- /**
- * 上传单个文件 uploadFile(String clientFileName, String ftpPath)
- * @param clientFileName 本地要上传的文件的全路径
- * @param ftpPath FTP上对于根目录的路径
- * @throws IOException
- */
- public void uploadFile(String clientFileName, String ftpPath) throws
- Exception {
- if (isLogin) {
- try {
- //获取文件名
- String filename = "";
- int index = clientFileName.lastIndexOf("//");
- filename = clientFileName.substring(index + 1);
- ftpClient.chdir("//");
- ftpClient.setType(FTPTransferType.BINARY);
- if (checkFolderIsExist(ftpPath)) {
- ftpClient.chdir(ftpPath);
- } else {
- createFolder(ftpPath);
- }
- ftpClient.put(clientFileName, filename);
- } catch (Exception ex) {
- throw new Exception(ex.getMessage());
- }
- } else {
- throw new Exception("you didnot login remote ftp server!");
- }
- }
4、下载FTP服务器上指定的文件下的文件和子文件夹
- /**
- * 下载FTP服务器上指定的文件下的文件和子文件夹
- * @param ftpdir 服务器上要下载的文件夹,以根目录开始的相对路径(不含要下载的文件夹名)
- * @param outdir 要存放文件的本地目录
- * @param ftpdir 要下载的文件夹
- * @throws IOException
- */
- public void downloadFolder(String ftppath, String outdir, String ftpdir) throws
- IOException {
- try {
- ftppath = ftppath.replace('//', '/');
- if (!ftppath.endsWith("/")) {
- ftppath = ftppath + "/";
- }
- outdir = outdir.replace('//', '/');
- if (!outdir.endsWith("/")) {
- outdir = outdir + "/";
- }
- System.out.println("当前FTP路径:" + File.separator + ftppath + ftpdir);
- System.out.println("当前本地路径:" + outdir);
- ftpClient.chdir(File.separator + ftppath + ftpdir); //进入目录
- //ftpClient.chdir(ftppath); //进入指定目录
- //列出目录下所有文件和文件夹
- FTPFile[] ftpfiles = ftpClient.dirDetails("");
- for (int i = 0; i < ftpfiles.length; i++) {
- FTPFile ftpobj = ftpfiles[i];
- // System.out.println("===================================");
- //System.out.println("文件名:"+ftpobj.getName());
- //System.out.println("路径:"+ftpobj.getPath());
- //System.out.println("是否是止录:"+ftpobj.isDir());
- //System.out.println("最后修改日录:"+ftpobj.lastModified());
- //System.out.println("===================================");
- if (!ftpobj.isDir()) { //是文件则直接下载文件
- System.out.println("xiazaiwenjian:" + outdir +
- File.separator + ftpobj.getName());
- // System.out.println("");
- ftpClient.get(outdir + File.separator + ftpobj.getName(),
- ftpobj.getPath() + File.separator +
- ftpobj.getName());
- } else {
- createDirectory(outdir, ftpobj.getName());
- System.out.println(ftpobj.getPath());
- downloadFolder(ftppath,
- outdir + File.separator + ftpobj.getName(),
- ftpdir + File.separator + ftpobj.getName());
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
5、下载单个文件
- /**
- *下载单个文件 downloadFile(String remoteFileName,String localFileName)
- * @param remoteFileName --服务器上的文件名(含全路径)
- * @param localFileName--本地文件名(全路径名)
- */
- public void downloadFile(String remoteFileName,String localFileName){
- try{
- ftpClient.get(localFileName, remoteFileName);
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- }
- }
6、删除指定文件
- /**
- * 删除指定文件 String deleteFile(String ftpPath)
- * @param ftpPath FTP上对于根目录的路径
- * @throws IOException
- */
- public String deleteFile(String ftpPath) throws
- Exception {
- if (isLogin) {
- String strMsg = "";
- try {
- ftpClient.delete(ftpPath);
- strMsg+="删除文件成功";
- } catch (FTPException ex) {
- strMsg += "删除文件错误:" + ex.getMessage();
- } catch (IOException ex) {
- strMsg += "操作文件错误:" + ex.getMessage();
- }
- return strMsg;
- } else {
- throw new Exception("you didnot login remote ftp server!");
- }
- }
7、删除指定目录(包括文件夹本身)
- /**
- * 4、删除指定目录(包括文件夹本身)deleteFolder(String ftpPath)
- * @param ftpPath FTP上对于根目录的路径
- * @throws IOException
- */
- public String deleteFolder(String ftpPath) throws
- Exception {
- if (isLogin) {
- String strMsg = "";
- ftpClient.chdir("//"); //进入目录
- //列出目录下所有文件和文件夹
- FTPFile[] ftpfiles = ftpClient.dirDetails(ftpPath);
- for (int i = 0; i < ftpfiles.length; i++) {
- FTPFile tempftpfile = ftpfiles[i];
- System.out.println("===================================");
- System.out.println("文件名:"+tempftpfile.getName());
- System.out.println("路径:"+tempftpfile.getPath());
- System.out.println("是否是止录:"+tempftpfile.isDir());
- System.out.println("最后修改日录:"+tempftpfile.lastModified());
- System.out.println("===================================");
- if (tempftpfile.isDir()) {
- ftpPath = ftpPath + "//" + tempftpfile.getName();
- System.out.println("1:" + ftpPath);
- deleteFolder(ftpPath);
- } else {
- ftpClient.delete(ftpPath + "//" + tempftpfile.getName());
- }
- }
- ftpClient.cdup();
- ftpClient.rmdir(ftpPath);
- return strMsg;
- } else {
- throw new Exception("you didnot login remote ftp server!");
- }
- }
8、其他函数:判断文件夹、文件是否存在;创建文件夹或者文件
- /**
- * 判断文件夹是否存在,这种方式不是很准
- * @param dirname 要判断的目录名
- * @param files FTP上的文件列表
- */
- public static boolean isDirExist(String dirname, String[] files) {
- for (int i = 0; i < files.length; i++) {
- if (files[i].indexOf("<DIR>") > -1 &&
- files[i].indexOf(dirname) > -1) {
- return true;
- }
- }
- return false;
- }
- /**
- * 在FTP服务上建立目录
- * @param directory FTP上对于根目录的路径
- * @param subDirectory 要在FTP上建立的目录
- */
- private static void createDirectory(String directory, String subDirectory) {
- String dir[];
- File fl = new File(directory);
- try {
- if (subDirectory == "" && fl.exists() != true) {
- fl.mkdir();
- } else if (subDirectory != "") {
- dir = subDirectory.replace('//', '/').split("/");
- for (int i = 0; i < dir.length; i++) {
- File subFile = new File(directory + File.separator + dir[i]);
- if (subFile.exists() == false) {
- subFile.mkdir();
- }
- directory += File.separator + dir[i];
- }
- }
- } catch (Exception ex) {
- System.out.println(ex.getMessage());
- }
- }
- /**
- * 检查FTP服务器上文件夹是否存在
- * @param pFolder FTP上对于根目录的路径
- * @throws Exception
- */
- public boolean checkFolderIsExist(String pFolder) throws Exception {
- if (isLogin) {
- String folder = pFolder.trim();
- if (folder.startsWith("//")) {
- folder = folder.substring(1);
- }
- if (folder.endsWith("//")) {
- folder = folder.substring(0, folder.length() - 1);
- }
- String strLayer = "..";
- if (folder.indexOf("//") > 0) {
- String[] folders = folder.split("////");
- for (int i = 1; i < folders.length; i++) {
- strLayer += ",";
- //System.out.println("strLayer:"+strLayer);
- }
- }
- boolean result = false;
- try {
- ftpClient.chdir(folder);
- ftpClient.chdir(strLayer);
- result = true;
- } catch (Exception ex) {
- result = false;
- }
- return result;
- } else {
- throw new Exception("you didnot login remote ftp server!");
- }
- }
- /**
- * 创建远程FTP服务器文件夹
- * @param pFolder FTP上对于根目录的路径
- * @throws Exception
- */
- public void createFolder(String pFolder) throws Exception {
- if (isLogin) {
- if (checkFolderIsExist(pFolder) == false) {
- try {
- String path = "";
- ftpClient.chdir("//");
- String[] folders = pFolder.split("////");
- for (int i = 0; i < folders.length; i++) {
- try {
- ftpClient.chdir(folders[i]);
- } catch (Exception ex) {
- ftpClient.mkdir(folders[i]);
- ftpClient.chdir(folders[i]);
- }
- }
- } catch (Exception ex) {
- throw new Exception(ex.getMessage());
- }
- }
- } else {
- throw new Exception("you didnot login remote ftp server!");
- }
- }