Java ftp 上传文件和下载文件

今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下。结果悲剧了,运行不通过。(装逼失败)

我找的文章链接:http://blog.csdn.net/yucaifu1989/article/details/51483118

为了方便大家对比,我吧文章代码偷了过来:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
import sun.net.ftp.FtpProtocolException;
/**
 * Java自带的API对FTP的操作
 * @Jdk:version 1.7
 * @Title:Ftp.java
 * @author: boonya
 * @notice: 貌似此方法有个缺陷,不能操作大文件
 */
public class FtpJdk
{
    /**
     *
     * 本地文件名
     */
    private String localfilename;
    /**
     *
     * 远程文件名
     */
    private String remotefilename;
    /**
     *
     * FTP客户端
     */
    private FtpClient ftpClient;  

    /**
     * 服务器连接
     *
     * @param ip
     *            服务器IP
     * @param port
     *            服务器端口
     * @param user
     *            用户名
     * @param password
     *            密码
     * @param path
     *            服务器路径
     * @throws FtpProtocolException
     *
     */
    public void connectServer(String ip, int port, String user, String password, String path) throws FtpProtocolException
    {
        try
        {
            /* ******连接服务器的两种方法****** */
            // 第一种方法
            /*
             * ftpClient =FtpClient.create();
             * ftpClient.connect(new InetSocketAddress(ip, port));
             */
            // 第二种方法
            ftpClient = FtpClient.create(ip);
            ftpClient.login(user, null, password);
            // 设置成2进制传输
            ftpClient.setBinaryType();
            System.out.println("login success!");  

            if (path.length() != 0)
            {
                // 把远程系统上的目录切换到参数path所指定的目录
                ftpClient.changeDirectory(path);
            }
            ftpClient.setBinaryType();
        } catch (IOException ex)
        {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }  

    }  

    /**
     * 关闭连接
     *
     */  

    public void closeConnect()
    {
        try
        {
            ftpClient.close();
            System.out.println("disconnect success");
        } catch (IOException ex)
        {
            System.out.println("not disconnect");
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }  

    /**
     *
     * 上传文件
     *
     * @param localFile
     *            本地文件
     * @param remoteFile
     *            远程文件
     * @throws FtpProtocolException
     */
    public void upload(String localFile, String remoteFile) throws FtpProtocolException
    {
        this.localfilename = localFile;
        this.remotefilename = remoteFile;
        TelnetOutputStream os = null;
        FileInputStream is = null;
        try
        {
            // 将远程文件加入输出流中
            os = (TelnetOutputStream) ftpClient.putFileStream(this.remotefilename, true);  

            // 获取本地文件的输入流
            File file_in = new File(this.localfilename);
            is = new FileInputStream(file_in);  

            // 创建一个缓冲区
            byte[] bytes = new byte[1024];
            int c;
            while ((c = is.read(bytes)) != -1)
            {
                os.write(bytes, 0, c);
            }
            System.out.println("upload success");
        } catch (IOException ex)
        {
            System.out.println("not upload");
            ex.printStackTrace();
            throw new RuntimeException(ex);
        } finally
        {
            try
            {
                if (is != null)
                {
                    is.close();
                }
            } catch (IOException e)
            {
                e.printStackTrace();
            } finally
            {
                try
                {
                    if (os != null)
                    {
                        os.close();
                    }
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }  

    /**
     *
     * 下载文件
     *
     * @param remoteFile
     *            远程文件路径(服务器端)
     * @param localFile
     *            本地文件路径(客户端)
     * @throws FtpProtocolException
     *
     */
    public void download(String remoteFile, String localFile) throws FtpProtocolException
    {
        TelnetInputStream is = null;
        FileOutputStream os = null;
        try
        {  

            // 获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。
            is = (TelnetInputStream) ftpClient.getFileStream(remoteFile);
            File file_in = new File(localFile);
            os = new FileOutputStream(file_in);  

            byte[] bytes = new byte[1024];
            int c;
            while ((c = is.read(bytes)) != -1)
            {
                os.write(bytes, 0, c);
            }
            System.out.println("download success");
        } catch (IOException ex)
        {
            System.out.println("not download");
            ex.printStackTrace();
            throw new RuntimeException(ex);
        } finally
        {
            try
            {
                if (is != null)
                {
                    is.close();
                }
            } catch (IOException e)
            {
                e.printStackTrace();
            } finally
            {
                try
                {
                    if (os != null)
                    {
                        os.close();
                    }
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }  

    /**
     * 函数入口
     *
     * @param agrs
     */
    public static void main(String agrs[])
    {  

        String filepath[] =
        { "/temp/aa.txt", "/temp/regist.log" };
        String localfilepath[] =
        { "C:\\tmp\\1.txt", "C:\\tmp\\2.log" };
        FtpJdk ftp = new FtpJdk();
        /*
         * 使用默认的端口号、用户名、密码以及根目录连接FTP服务器
         */
        try
        {
            ftp.connectServer("127.0.0.1", 22, "boonya", "[email protected]", "/temp");
        } catch (FtpProtocolException e)
        {
            e.printStackTrace();
        }
        // 下载
        for (int i = 0; i < filepath.length; i++)
        {
            try
            {
                ftp.download(filepath[i], localfilepath[i]);
            } catch (FtpProtocolException e)
            {
                e.printStackTrace();
            }
        }
        String localfile = "E:\\contact.txt";
        String remotefile = "/temp/records.txt";
        // 上传
        try
        {
            ftp.upload(localfile, remotefile);
        } catch (FtpProtocolException e)
        {
            e.printStackTrace();
        }
        ftp.closeConnect();
    }  

}  

文章代码

顺便把错误的log贴出来:

sun.net.ftp.FtpProtocolException: TYPE I:530 Please login with USER and PASS.

    at sun.net.ftp.impl.FtpClient.issueCommandCheck(FtpClient.java:544)
    at sun.net.ftp.impl.FtpClient.setType(FtpClient.java:1668)
    at sun.net.ftp.FtpClient.setBinaryType(FtpClient.java:676)
    at ftp.FtpJdk.connectServer(FtpJdk.java:67)
    at ftp.FtpJdk.main(FtpJdk.java:248)
not upload
Disconnected from the target VM, address: ‘127.0.0.1:49353‘, transport: ‘socket‘
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
    at sun.net.ftp.impl.FtpClient.readServerResponse(FtpClient.java:420)
    at sun.net.ftp.impl.FtpClient.readReply(FtpClient.java:497)
    at sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:532)
    at sun.net.ftp.impl.FtpClient.issueCommandCheck(FtpClient.java:543)
    at sun.net.ftp.impl.FtpClient.openDataConnection(FtpClient.java:757)
    at sun.net.ftp.impl.FtpClient.putFileStream(FtpClient.java:1320)
    at ftp.FtpJdk.upload(FtpJdk.java:122)
    at ftp.FtpJdk.main(FtpJdk.java:269)
Exception in thread "main" java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out
    at ftp.FtpJdk.upload(FtpJdk.java:140)
    at ftp.FtpJdk.main(FtpJdk.java:269)
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
    at sun.net.ftp.impl.FtpClient.readServerResponse(FtpClient.java:420)
    at sun.net.ftp.impl.FtpClient.readReply(FtpClient.java:497)
    at sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:532)
    at sun.net.ftp.impl.FtpClient.issueCommandCheck(FtpClient.java:543)
    at sun.net.ftp.impl.FtpClient.openDataConnection(FtpClient.java:757)
    at sun.net.ftp.impl.FtpClient.putFileStream(FtpClient.java:1320)
    at ftp.FtpJdk.upload(FtpJdk.java:122)
    ... 1 more

错误log

有兴趣的可以研究一下,希望找到原因的可以告诉一下博主,谢谢。

尽管博主装逼失败,但逼装了,还是要继续装下去的,于是,找到了以下的办法,博主亲测成功,不成功可以联系博主。不多说直接贴代码:

用到的jar:

commons-net-1.4.1.jar

maven下载

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

ftp工具类:

package ftp.ftp2;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpProtocolException;

import java.io.*;
import java.net.SocketException;
import java.util.Properties;

public class FtpUtil {

    /**
     * 获取FTPClient对象
     *
     * @param ftpHost     FTP主机服务器
     * @param ftpPassword FTP 登录密码
     * @param ftpUserName FTP登录用户名
     * @param ftpPort     FTP端口 默认为21
     * @return
     */
    public static FTPClient getFTPClient(String ftpHost, String ftpUserName,
                                         String ftpPassword, int ftpPort) {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient = new FTPClient();
            ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                System.out.println("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                System.out.println("FTP连接成功。");
            }
        } catch (SocketException e) {
            e.printStackTrace();
            System.out.println("FTP的IP地址可能错误,请正确配置。");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("FTP的端口错误,请正确配置。");
        }
        return ftpClient;
    }

    /*
     * 从FTP服务器下载文件
     *
     * @param ftpHost FTP IP地址
     * @param ftpUserName FTP 用户名
     * @param ftpPassword FTP用户名密码
     * @param ftpPort FTP端口
     * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
     * @param localPath 下载到本地的位置 格式:H:/download
     * @param fileName 文件名称
     */
    public static void downloadFtpFile(String ftpHost, String ftpUserName,
                                       String ftpPassword, int ftpPort, String ftpPath, String localPath,
                                       String fileName) {

        FTPClient ftpClient = null;

        try {
            ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
            ftpClient.setControlEncoding("UTF-8"); // 中文支持
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(ftpPath);

            File localFile = new File(localPath + File.separatorChar + fileName);
            OutputStream os = new FileOutputStream(localFile);
            ftpClient.retrieveFile(fileName, os);
            os.close();
            ftpClient.logout();

        } catch (FileNotFoundException e) {
            System.out.println("没有找到" + ftpPath + "文件");
            e.printStackTrace();
        } catch (SocketException e) {
            System.out.println("连接FTP失败.");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件读取错误。");
            e.printStackTrace();
        }

    }

    /**
     * Description: 向FTP服务器上传文件
     * @param ftpHost FTP服务器hostname
     * @param ftpUserName 账号
     * @param ftpPassword 密码
     * @param ftpPort 端口
     * @param ftpPath  FTP服务器中文件所在路径 格式: ftptest/aa
     * @param fileName ftp文件名称
     * @param input 文件流
     * @return 成功返回true,否则返回false
     */
    public static boolean uploadFile(String ftpHost, String ftpUserName,
                                     String ftpPassword, int ftpPort, String ftpPath,
                                     String fileName,InputStream input) {
        boolean success = false;
        FTPClient ftpClient = null;
        try {
            int reply;
            ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                return success;
            }
            ftpClient.setControlEncoding("UTF-8"); // 中文支持
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(ftpPath);

            ftpClient.storeFile(fileName, input);

            input.close();
            ftpClient.logout();
            success = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }

}

测试类:

package ftp.ftp2;

import java.io.*;

/**
 * Created by jyf on 2017/6/2.
 */
public class test {
    public static void main(String[] args) {
        String ftpHost = "172.16.114.10";
        String ftpUserName = "user";
        String ftpPassword = "a";
        int ftpPort = 21;
        String ftpPath = "test2/";
        String localPath = "F:\\11.txt";
        String fileName = "11.txt";

        //上传一个文件
        try{
            FileInputStream in=new FileInputStream(new File(localPath));
            boolean test = FtpUtil.uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName,in);
            System.out.println(test);
        } catch (FileNotFoundException e){
            e.printStackTrace();
            System.out.println(e);
        }

        //在FTP服务器上生成一个文件,并将一个字符串写入到该文件中
        try {
            InputStream input = new ByteArrayInputStream("test ftp jyf".getBytes("GBK"));
            boolean flag = FtpUtil.uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName,input);;
            System.out.println(flag);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //下载一个文件
        FtpUtil.downloadFtpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, localPath, fileName);
    }
}

希望可以帮助到大家,也希望对自己的知识做个记录,感谢网上那些大神们的代码分享,有雷同,希望联系博主更改

时间: 2024-09-30 20:03:08

Java ftp 上传文件和下载文件的相关文章

批处理向FTP上传指定属性的文件 批处理增量备份的例子

使用windows批处理向FTP上传具有指定属性的文件,类似增量备份功能. 对一个目录里的几个文件自动上传FTP时只上传有归档属性的文件,然后FTP上传成功后自动清除(本机)刚上传文件的归档属性. 类似于对文件增量备份的功能. @echo off rem 指定FTP用户名 set ftpUser=FTPUSERNAME rem 指定FTP密码 set ftpPass=FTPPASSWORD rem 指定FTP服务器地址 set ftpIP=192.168.0.2 设置待上传的本地文件夹目录 se

java FTP上传和下载文件

1 package com.ftp; 2 3 /** 4 * ftp链接常量 5 * 6 */ 7 public class Ftp { 8 9 private String ipAddr;//ip地址 10 11 private Integer port;//端口号 12 13 private String userName;//用户名 14 15 private String pwd;//密码 16 17 private String path;//aaa路径 18 19 public St

FTP文件操作 上传文、 下载文件、删除文件 、创建目录

/// <summary> /// FTP上传文件 /// </summary> /// <param name="fileUpload">上传控件</param> /// <param name="ftpServerIP">上传文件服务器IP</param> /// <param name="ftpUserID">服务器用户名</param> ///

java ftp 上传下载工具类

1 package com.mohecun.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.OutputStre

Jenkins通过FTP上传站点太多文件导致太慢且不稳定,切换为压包上传再解压的思路(asp.net)

在本地先处理好要上传的站点文件之后,可能会因为一些网页切图导致ftp上传不稳定,中断,或者文件占用的问题. 那么换了一种实现思路,要借助jenkins的工具jenkins-cli.jar. 解决思路: 1.本地处理好奥上传的站点文件,通过压缩软件进行打包,其中压包的命名有规律,比如日期+BuildID的形式. 2.用FTP插件进行上传到外网的目录. 3.外网的机器上也同样安装Jenkins的环境,并新建好一个Job,这个Job增加参数化构建,参数为BuildID,然后增加批处理进行BuildID

java ftp上传下载

/** * Description: 从FTP服务器下载文件 * @param url FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param remotePath FTP服务器上的相对路径 * @param fileName 要下载的文件名 * @param localPath 下载后保存到本地的路径 * @return */ public static

Java FTP上传下载的实现

昨天修改了一个接口,看到它涉及FTP的上传与下载,用的是:org.apache.commons.net.ftp.FTPClient,它只支持FTP,不支持SFTP 总结下来如此使用: //创建对象 FTPClient fTPClient=new FTPClient(); //创建连接 fTPClient.connect("192.168.1.11",21); //登陆 fTPClient.login("root", "root"); //设置传输

20160113006 asp.net实现ftp上传代码(解决大文件上传问题)

using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using

ssh批量登录 上传 执行命令 下载文件

用途: 搞linux主机的内网,拿到通用的账户密码,批量登录,上传系统信息收集脚本,把执行的结果拉回本地,用于分析. 缺点: 不支持多线程  密码必须正确切可连通  端口硬编码为22 如果不是22 请自行修改 执行过程: 执行ssh.py root root 会自动登录ssh,上传本地文件目录下的1.py文件到linux服务器tmp目录,执行/tmp/1.py文件,删除/tmp/1.py文件,把1.py执行的文件的生成的test.txt下载回本地.注意:下载的文件名已硬编码在1.py文件28行,