java 实现ftp上传如何创建文件夹?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 实现ftp上传如何创建文件夹?相关的知识,希望对你有一定的参考价值。

准备条件:java实现ftp上传用到了commons-net-3.3.jar包

首先建立ftphost连接

public boolean connect(String path, String addr, int port, String username, String password) 
try 
//FTPClient ftp = new FTPHTTPClient(addr, port, username, password);
ftp = new FTPClient();
int reply;
ftp.connect(addr);
System.out.println("连接到:" + addr + ":" + port);
System.out.print(ftp.getReplyString());
reply = ftp.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) 
ftp.disconnect();
System.err.println("FTP目标服务器积极拒绝.");
System.exit(1);
return false;
else
ftp.login(username, password);
ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.changeWorkingDirectory(path);
System.out.println("已连接:" + addr + ":" + port);
return true;

 catch (Exception ex) 
ex.printStackTrace();
System.out.println(ex.getMessage());
return false;

然后再利用ftpclient的makeDirectory方法创建文件夹

public void createDir(String dirname)
try
ftp.makeDirectory(dirname);
System.out.println("在目标服务器上成功建立了文件夹: " + dirname);
catch(Exception ex)
System.out.println(ex.getMessage());

断开host连接

public void disconnect()
try 
ftp.disconnect();
 catch (IOException e) 
e.printStackTrace();

最后是程序的调用方法

public static void main(String[] args) 
FtpUploadTest ftpupload = new FtpUploadTest();
if(ftpupload.connect("", "172.39.8.x", 20, "administrator", "abc@123"))
ftpupload.createDir("/UPLOAD");
ftpupload.disconnect();

参考技术A

这个功能我也刚写完,不过我也是得益于同行,现在我也把自己的分享给大家,希望能对大家有所帮助,因为自己的项目不涉及到创建文件夹,也仅作分享,不喜勿喷谢谢!

interface :
package com.sunline.bank.ftputil;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import org.apache.commons.net.ftp.FTPClient;

public interface IFtpUtils 
/**
  * ftp登录
  * @param hostname  主机名
  * @param port 端口号
  * @param username 用户名
  * @param password 密码
  * @return
  */
public  FTPClient loginFtp(String hostname,Integer port,String username,String password);
/**
  * 上穿文件
  * @param hostname 主机名
  * @param port 端口号
  * @param username 用户名
  * @param password 密码
  * @param fpath ftp路径
  * @param localpath  本地路径
  * @param fileName 文件名
  * @return
  */
public boolean uploadLocalFilesToFtp(String hostname,Integer port,String username,String password,String fpath,String localpath,String fileName);
/**
* 批量下载文件
* @param hostname
* @param port
* @param username
* @param password
* @param fpath
* @param localpath
* @param fileName 源文件名
* @param filenames 需要修改成的文件名
* @return
*/
public boolean downloadFileList(String hostname,Integer port,String username,String password,String fpath,String localpath,String fileName, String filenames);
/**
  * 修改文件名
  * @param localpath
  * @param fileName 源文件名
  * @param filenames 需要修改的文件名
  */
public void modifiedLocalFileName(String localpath,String fileName, String filenames);
/**
* 关闭流连接、ftp连接
* @param ftpClient
* @param bufferRead 
* @param buffer
*/
public void closeFtpConnection(FTPClient ftpClient,BufferedOutputStream bufferRead,BufferedInputStream buffer);


impl:
package com.sunline.bank.ftputil;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import common.Logger;

public class FtpUtilsImpl implements IFtpUtils
private static Logger log = Logger.getLogger(FtpUtilsImpl.class);
FTPClient ftpClient = null;
Integer reply = null;

@Override
public  FTPClient loginFtp(String hostname,Integer port,String username,String password) 
  ftpClient = new FTPClient();
try 
ftpClient.connect(hostname, port);
ftpClient.login(username, password);
ftpClient.setControlEncoding("utf-8");
reply = ftpClient.getReplyCode();
ftpClient.setDataTimeout(60000);
ftpClient.setConnectTimeout(60000);
//设置文件类型为二进制(避免解压缩文件失败)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//开通数据端口传输数据,避免阻塞
ftpClient.enterLocalActiveMode();
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) 
log.error("连接FTP失败,用户名或密码错误");
else
log.info("FTP连接成功");

 catch (Exception e) 
if (!FTPReply.isPositiveCompletion(reply)) 
try 
ftpClient.disconnect();
 catch (IOException e1) 
log.error("登录FTP失败,请检查FTP相关配置信息是否正确",e1);



return ftpClient;


@Override
@SuppressWarnings("resource")
public boolean uploadLocalFilesToFtp(String hostname,Integer port,String username,String password,String fpath,String localpath,String fileName) 
boolean flag = false;
ftpClient = loginFtp(hostname, port, username, password);
BufferedInputStream buffer=null;
try 
buffer = new BufferedInputStream(new FileInputStream(localpath + fileName));
ftpClient.changeWorkingDirectory(fpath);
fileName = new String(fileName.getBytes("utf-8"),ftpClient.DEFAULT_CONTROL_ENCODING);
if (!ftpClient.storeFile(fileName, buffer)) 
log.error("上传失败");
return flag;

buffer.close();
ftpClient.logout();
flag = true;
return flag;
 catch (Exception e) 
e.printStackTrace();
finally
closeFtpConnection(ftpClient, null,buffer);
log.info("文件上传成功");

return false;


@Override
public boolean downloadFileList(String hostname,Integer port,String username,String password,String fpath,String localpath,String fileName, String filenames)
ftpClient = loginFtp(hostname, port, username, password);
boolean flag = false;
         BufferedOutputStream bufferRead=null;
if(fpath.startsWith("/") && fpath.endsWith("/"))
try 
//切换到当前目录
this.ftpClient.changeWorkingDirectory(fpath);
this.ftpClient.enterLocalActiveMode();
FTPFile [] ftpFiles = this.ftpClient.listFiles();
for (FTPFile files : ftpFiles) 
if (files.isFile()) 
System.out.println("=================="+files.getName());
File localFile = new File(localpath + "/" + files.getName()); 
bufferRead = new BufferedOutputStream(new FileOutputStream(localFile));
ftpClient.retrieveFile(files.getName(), bufferRead); 
bufferRead.flush();


ftpClient.logout();
flag = true;
               
 catch (IOException e) 
e.printStackTrace();
finally 
            closeFtpConnection(ftpClient,bufferRead,null);
            log.info("文件下载成功");
          

modifiedLocalFileName(localpath,fileName,filenames);
return flag;


@Override
public void modifiedLocalFileName(String localpath,String fileName, String filenames)
File file = new File(localpath);
File [] fileList = file.listFiles();
if (file.exists()) 
if (null == fileList ||fileList.length == 0) 
log.error("文件夹是空的");
else
for (File data : fileList) 
String orprefix = data.getName().substring(0,data.getName().lastIndexOf("."));
String prefix = fileName.substring(0,fileName.lastIndexOf("."));
System.out.println("index===" + orprefix + "prefix ===" + prefix);
if (orprefix.contains(prefix)) 
boolean f = data.renameTo(new File(localpath + "/"+filenames));
System.out.println("f============="+f);
else
log.error("需要重命名的文件不存在,请检查。。。");





 

@Override
public void closeFtpConnection(FTPClient ftpClient,BufferedOutputStream bufferRead,BufferedInputStream buffer)
if(ftpClient.isConnected()) 
             try
                 ftpClient.disconnect();
             catch(IOException e)
                 e.printStackTrace();
             
          
if(null != bufferRead)
             try 
                 bufferRead.close();
              catch (IOException e) 
                 e.printStackTrace();
              
          
if(null != buffer)
             try 
              buffer.close();
              catch (IOException e) 
                 e.printStackTrace();
              
          

 
 
public static void main(String[] args) throws IOException 
String hostname = "xx.xxx.x.xxx";
Integer port = 21;
String username = "edwftp";
String password = "edwftp";
String fpath = "/etl/etldata/back/";
String localPath = "C:/Users/Administrator/Desktop/ftp下载/";
String fileName = "test.txt";
String filenames = "ok.txt";
FtpUtilsImpl ftp = new FtpUtilsImpl();
/*ftp.modifiedLocalFileName(localPath,fileName,filenames);*/
ftp.downloadFileList(hostname, port, username, password, fpath, localPath,fileName,filenames);
/*ftp.uploadLocalFilesToFtp(hostname, port, username, password, fpath, localPath, fileName);*/
/*ftp.modifiedLocalFileName(localPath);*/

参考技术B 首先保证ftp服务器的创建文件夹权限已开放,关键代码如下。
/**
* 在当前目录下创建文件夹
*
* @param dir
* @return
* @throws Exception
*/
private boolean createDir(String dir)
try
ftpClient.ascii();
StringTokenizer s = new StringTokenizer(dir, "/"); // sign
s.countTokens();
String pathName = ftpClient.pwd();
while (s.hasMoreElements())
pathName = pathName + "/" + (String) s.nextElement();
try
ftpClient.sendServer("MKD " + pathName + "\r\n");
catch (Exception e)
e = null;
return false;

ftpClient.readServerResponse();

ftpClient.binary();
return true;
catch (IOException e1)
e1.printStackTrace();
return false;

本回答被提问者采纳
参考技术C 用ftp命令:mkdir()
可以创建文件夹。
参考技术D 无法实现.服务器不能任由你修改.

以上是关于java 实现ftp上传如何创建文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何用c语言实现上传文件

创建FTP站点,实现匿名用户的上传与下载

java Ftp上传创建多层文件的代码片段

基于commons-net实现ftp创建文件夹上传下载功能.

java怎么实现SFTP上传文件夹,包括整个目录?

用java完成文件ftp上传下载