Java 使用 FTP 实现大文件上传下载

Java 上传下载 1G 以上的文件可以通过 http 协议或 ftp 实现,但是 http 协议对文件上传大小有限制,而且还不稳定,因此这里使用 ftp 上传。
ftp 上传方式有两种:
一、ASCII 传输方式:假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
       但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输
二、二进制传输方式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到IBM VM系统,在对方系统上,此文件不能执行。(但是,它可以从VM系统上以二进制方式拷贝到另一macintosh,是可以执行的)。
       如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。
       因此,这就意谓着知道你要传输的是什么类型的数据是重要的,下列给出一些常见文件类型的提示

文件方式
Text fileASCII
Spreadsheet大多是二进制
Database file大多是二进制,也可能是ASCII
Word processor file大多是二进制,也可能是ASCII
Program source codeASCII
Electronic mail messagesASCII
UNIX“shell archive”ASCII
UNIX“tar file”二进制
backup file二进制
Compressed file二进制
Unencoded fileASCII
Excutable file二进制
Postscript file二进制

很多数据库程序用二进制格式存贮数据,即使数据原本是文本式。所以,除非你知道你的软件的用途,我们建议对数据库文件先用二进制方式试试。然后看看你传输的文件能否正确工作。如果不能,再试用另一方式。可执行的文件一般是二进制文件。
转至:文章出处

在写代码之前需要配置 FTP 服务,不然 FTP 用不了,具体配置百度,这个很简单。FTP 文件上传需要依赖:commons-net,我这里用的是3.6,算是比较新的了

FTP 实现文件上传下载代码如下

package com.feicuiedu.util;

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

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/**
 * 使用 FTP 实现文件上传下载<br>
 * @author admin
 *
 */
public class FavFTPUtil {

    /**
     * 上传文件(可供Action/Controller层使用)
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param fileName
     *            上传到FTP服务器后的文件名称
     * @param inputStream
     *            输入文件流
     * @return
     */
    public static boolean uploadFile(String hostname, int port, String username, String password, String pathname,
            String fileName, InputStream inputStream) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("UTF-8");
        try {
            // 连接FTP服务器
            ftpClient.connect(hostname, port);
            // 登录FTP服务器
            ftpClient.login(username, password);
            // 是否成功登录FTP服务器
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }

            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.makeDirectory(pathname);
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.storeFile(fileName, inputStream);
            inputStream.close();
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    /**
     * 上传文件(可对文件进行重命名)
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param filename
     *            上传到FTP服务器后的文件名称
     * @param originfilename
     *            待上传文件的名称(绝对地址)
     * @return
     */
    public static boolean uploadFileFromProduction(String hostname, int port, String username, String password,
            String pathname, String filename, String originfilename) {
        boolean flag = false;
        try {
            InputStream inputStream = new FileInputStream(new File(originfilename));
            flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 上传文件(不可以进行文件的重命名操作)
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param originfilename
     *            待上传文件的名称(绝对地址)
     * @return
     */
    public static boolean uploadFileFromProduction(String hostname, int port, String username, String password,
            String pathname, String originfilename) {
        boolean flag = false;
        try {
            String fileName = new File(originfilename).getName();
            InputStream inputStream = new FileInputStream(new File(originfilename));
            flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 删除文件
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param filename
     *            要删除的文件名称
     * @return
     */
    public static boolean deleteFile(String hostname, int port, String username, String password, String pathname,
            String filename) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接FTP服务器
            ftpClient.connect(hostname, port);
            // 登录FTP服务器
            ftpClient.login(username, password);
            // 验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }
            // 切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.dele(filename);
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }
        return flag;
    }

    /**
     * 下载文件
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器文件目录
     * @param filename
     *            文件名称
     * @param localpath
     *            下载后的文件路径
     * @return
     */
    public static boolean downloadFile(String hostname, int port, String username, String password, String pathname,
            String filename, String localpath) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接FTP服务器
            ftpClient.connect(hostname, port);
            // 登录FTP服务器
            ftpClient.login(username, password);
            // 验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }
            // 切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            FTPFile[] ftpFiles = ftpClient.listFiles();
            for (FTPFile file : ftpFiles) {
                if (filename.equalsIgnoreCase(file.getName())) {
                    File localFile = new File(localpath + "/" + file.getName());
                    OutputStream os = new FileOutputStream(localFile);
                    ftpClient.retrieveFile(file.getName(), os);
                    os.close();
                }
            }
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }
        return flag;
    }

    public static void main(String[] args) {
        String hostname = "192.168.xx.xxx";
        int port = 21;
        String username = "admin";
        String password = "admin123";
        String originfilename = "/Users/admin/work/accessory/test/WIN10-64.GHO";
        boolean res = uploadFileFromProduction(hostname, port, username, password, "/test", originfilename);
//      String pathname = "E:/fileZilla";
//      String filename = "003.xlsx";
//      String localpath = "/Users/wangbt/work/accessory/OA";
//      downloadFile(hostname, port, username, password, pathname, filename, localpath);
        System.out.println(res + "=======");
    }
}

4G大文件上传是没问题的,时间大约是 十分钟,下载大文件没试过,但小文件是没问题的,改天可以试一试
转至:代码出处

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 可以使用Java的网络编程功能,实现FTP协议的文件上传。具体步骤如下: 1. 建立与FTP服务器的连接:使用Java的Socket类进行连接,并使用该类的方法登录到FTP服务器。 2. 设置上传模式:使用FTP协议的特定命令设置上传模式为二进制模式。 3. 构造文件使用Java的FileInputStream类读取待上传文件,并将其写入到FTP服务器。 4. 确认文件上传使用FTP协议的特定命令确认文件已经成功上传。 5. 断开连接:使用Java的Socket类断开与FTP服务器的连接。 可以使用现成的开源FTP客户端库,如Apache Commons Net,简化开发难度。 ### 回答2: 要使用Java实现FTP文件上传,你需要使用JavaFTP库或框架。以下是一种可能的实现方式: 首先,需要引入FTP库或框架的相关依赖。比较常用的库包括Apache Commons Net和Apache FTPClient。你可以在项目的构建文件(比如Maven的pom.xml文件)中添加相应的依赖。 接下来,你需要建立FTP连接。使用FTPClient类的connect()方法连接到FTP服务器。你需要提供FTP服务器的主机名、端口号、用户名和密码。 一旦连接成功,你可以使用FTPClient的setFileType()方法设置文件类型,如二进制文件或文本文件。 然后,你可以使用changeWorkingDirectory()方法切换到FTP服务器上的目标目录,比如上传文件的目录。 之后,你可以使用storeFile()方法上传文件。该方法的参数是本地文件的路径和文件名,以及在FTP服务器上的文件名。 在上传过程中,你可以使用FTPClient的进度监听器获取上传进度并进行相应的处理。比如,你可以实现一个ProgressListener接口的类,重写bytesTransferred()方法,在方法中显示或记录上传进度。 最后,上传完成后,你需要使用disconnect()方法关闭FTP连接。 需要注意的是,在实际的使用中,你还需要处理异常、处理上传失败的情况、上传文件时的断点续传等场景。这些细节根据具体的需求和使用情况可能会有所不同。 总结起来,实现FTP文件上传的步骤包括连接FTP服务器、设置文件类型、切换目录、上传文件,并考虑上传进度、异常处理和关闭连接等。使用JavaFTP库或框架可以简化这些操作,提高开发效率。 ### 回答3: Java实现FTP文件上传可以通过使用Apache Commons Net库来实现。以下是一个简单的示例代码: ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FTPFileUploader { private String server; private int port; private String username; private String password; public FTPFileUploader(String server, int port, String username, String password) { this.server = server; this.port = port; this.username = username; this.password = password; } public void uploadFile(String localFilePath, String remoteFilePath) { FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port); ftpClient.login(username, password); ftpClient.enterLocalPassiveMode(); File localFile = new File(localFilePath); FileInputStream fileInputStream = new FileInputStream(localFile); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.storeFile(remoteFilePath, fileInputStream); ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } finally { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String username = "your-username"; String password = "your-password"; String localFilePath = "path/to/local/file"; String remoteFilePath = "path/to/remote/file"; FTPFileUploader fileUploader = new FTPFileUploader(server, port, username, password); fileUploader.uploadFile(localFilePath, remoteFilePath); } } ``` 在这个示例代码中,首先创建了一个FTPClient对象,然后连接到指定的FTP服务器。调用`login`方法进行登录验证,并通过`enterLocalPassiveMode`方法进入被动模式。接着打开本地文件输入流,设置FTP传输类型为二进制文件类型,使用`storeFile`方法将本地文件上传到指定的远程路径中。最后关闭连接。 在使用这个示例代码时,需要将FTP服务器的地址、端口、用户名和密码替换为实际的值,并指定本地文件路径和远程文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值