java 上传文件到FTP(centos中的ftp服务)

ftp服务器系统:centos7 java

提供ftp的服务:vsftpdapache

pom.xml 依赖centos

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

代码:服务器

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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;

/**
 * ftp上传下载工具类
 * <p>Title: FtpUtil</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.com</p> 
 * @author    入云龙
 * @date    2015年7月29日下午8:11:51
 * @version 1.0
 */
public class FtpUtil {

    /** 
     * Description: 向FTP服务器上传文件 
     * @param host FTP服务器hostname 
     * @param port FTP服务器端口 
     * @param username FTP登陆帐号 
     * @param password FTP登陆密码 
     * @param basePath FTP服务器基础目录
     * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
     * @param filename 上传到FTP服务器上的文件名 
     * @param input 输入流 
     * @return 成功返回true,不然返回false 
     */  
    public static boolean uploadFile(String host, int port, String username, String password, String basePath,
            String filePath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);// 链接FTP服务器
            // 若是采用默认端口,可使用ftp.connect(host)的方式直接链接FTP服务器
            ftp.login(username, password);// 登陆
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return false;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                //若是目录不存在建立目录
                String[] dirs = filePath.split("/");
                //basePath应该先存在
                if(!ftp.changeWorkingDirectory(basePath)){
                    return false;
                }
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir))
                        continue;
                    if (!ftp.changeWorkingDirectory(dir)) {
                        //若是没法建立文件夹
                        if (!ftp.makeDirectory(dir)) {
                            return false;
                        }
                        else //文件夹建立后切换到当前目录
                        {
                            ftp.changeWorkingDirectory(dir);
                        }
                    }
                }
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            if (!ftp.storeFile(filename, input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }
    
    /** 
     * Description: 从FTP服务器下载文件 
     * @param host FTP服务器hostname 
     * @param port FTP服务器端口 
     * @param username FTP登陆帐号 
     * @param password FTP登陆密码 
     * @param remotePath FTP服务器上的相对路径 
     * @param fileName 要下载的文件名 
     * @param localPath 下载后保存到本地的路径 
     * @return 
     */  
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
            String fileName, String localPath) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);
            // 若是采用默认端口,可使用ftp.connect(host)的方式直接链接FTP服务器
            ftp.login(username, password);// 登陆
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + "/" + ff.getName());

                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }

            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }
    
    public static void main(String[] args) {
        try {  
            FileInputStream in=new FileInputStream(new File("E:\\picture\\wade.jpg"));
            boolean flag = uploadFile("192.168.1.105", 21, "ftpuser", "ftpuser", "pub/images","/2015/1/21", "gaigeming.jpg", in);
            System.out.println(flag);  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }  
    }
}

 

 

注意:工具

1.changeWorkingDirectory()返回false,切换工做目录失败。centos7

changeWorkingDirectory(),切换的目录的基础上是相对于当前目录,不是相对于根目录。你如今在dri1目录下,那么changeWorkingDirectory(“dir1_1”)就切换到“dir1/dir1_1”下。spa

 

2.makeDirectory(path)返回false。 .net

缘由1:code

  文件夹的权限,我上传的文件夹images是使用root用户建立的,权限: drwxr-xr-x. 4 root root 4096 Aug 24 02:28 images,咱们使用ftp用户时,没有写的权限,因此不能创建文件夹。xml

解决方法:

  修改文件夹权限。(注意ftp用户都应该有父文件夹和子文件夹的权限,个人上传文件夹是“pub/images”,ftp用户应该对pub有写权限,对images也有写权限)。

在 网上搜索了一下,还有缘由2。

缘由2:

  因为我使用的是普通帐号登陆,因此一开始就设置vsftpd的配置文件vsftpd.conf中chroot_local_user=YES,将用户禁锢在了宿主目录,致使始终没法建立目录。可是能够上传文件,不过,上传的文件最终也只能存放在宿主目录下,即 /home/test/xxx.txt。

解决方法:

  将vsftpd.conf文件中的chroot_local_user=NO,重启vsftpd便可。

我后面将chroot_local_user=YE并将服务重启后,makeDirectory(path)居然返回true,???

相关文章
相关标签/搜索