java 通过FTP上传与下载文件

Web开发时常会遇到需要用户上传文件,并且把文件保存下来。

通常来说我们不会把文件存放在与Tomcat同一个服务器中,而是有一个专门的文件服务器存放文件。

如何将文件保存到文件服务器中,这时候可以选择使用FTP将文件传输到专门的服务器。

使用FTP传输文件,我们所需要的只是一个jar包,文件服务器我选择的是Ubuntu

基本上所有的操作都基于 FTPClient 这个类的对象,

将文件上传到FTP服务器有一个需要注意的地方就是文件名的编码问题,如果编码格式不对,服务器里面会显示乱码。

现在开始介绍如何通过FTP上传与下载文件。

登录FTP服务器
        //创建FTP客户端,所有的操作都基于FTPClinet
        FTPClient ftp = new FTPClient();
        
        //连接FTP服务器
        ftp.connect("192.168.218.133");
        
        //如果是需要认证的服务器,就需要账号和密码来登录
        ftp.login("watson", "yehh1995");
        
        //获取服务器返回的状态码
        int reply = ftp.getReplyCode();
        System.out.println(reply);
        
        /*
         * 判断是否连接成功
         * 所有以2开头的代码是正完成响应。
         * FTP服务器将在最终发送一个肯定的完成响应成功完成命令。
         */
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            System.out.println("连接失败");
            return;
        }
        System.out.println("连接成功");
切换文件夹
ftpClient.changeWorkingDirectory("/ftp");
创建文件夹
我想将文件存放到/ftp/images里面,首先要创建这个文件

//返回一个布尔类型的值,来表示是否创建成功
boolean isCreate = ftpClient.makeDirectory("/ftp/images");
上传文件
//设置文件上传类型
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
 
//获取文件的输入流
FileInputStream fis = new FileInputStream("e:/1.jpg");
 
//调用storeFile方法将文件上传到FTP服务器
//第一个参数是上传到服务器的路径,包含了文件名
boolean isUpload = ftpClient.storeFile("/ftp/images/upload.jpg", fis);
遍历当前文件夹
FTPFile[] list = ftpClient.listFiles();
for (FTPFile ftpFile : list) {
    System.out.println("name: " + ftpFile.getName());
    System.out.println("group: " + ftpFile.getGroup());
    System.out.println("RwaListing: " + ftpFile.getRawListing());
    System.out.println("size: " + ftpFile.getSize());
    System.out.println("type: " + ftpFile.getType());
    System.out.println("user: " + ftpFile.getUser());
    System.out.println("timestamp: " + ftpFile.getTimestamp());
    System.out.println("class: " + ftpFile.getClass());
 
}
输入如下图所示

下载文件
FileOutputStream fos = new FileOutputStream("e:/upload.jpg");
boolean isDown = ftpClient.retrieveFile("/ftp/images/upload.jpg", fos);
调用retrieveFile,第一个参数是你要下载的图片的路径,第二个参数是处理文件的输出流,可以通过输出流将文件保存到本地,也可以响应到浏览器中。

注意事项:
1.调用storeFile前需要设置文件上传的类型,不然文件上传到服务器可能会出现文件损坏的情况

类型是FTP类下的一些静态成员变量

由于这里用的是字节流上传,所有选择 BINARY_FILE_TYPE 即可

2.文件名编码问题

如果你上传的文件名是中文的,那么很大可能在服务器里面会显示乱码,这是由于服务器的编码与我们字节码的编码不一致导致的。

解决方法是将文件服务器编码修改为UTF-8,或者将文件名重新编码一遍,再传给storeFile

String path = new String("/ftp/images/这是一张图片.jpg".getBytes("UTF-8"),"ISO-8859-1");
boolean isUpload = ftpClient.storeFile(path, fis);
3.权限问题

由于账号权限的问题,你创建的文件夹与上传的文件的权限可能都是700,这样会导致文件无法读取。这时候需要手动设置文件的权限。

//设置文件权限 
boolean isSet = ftp.sendSiteCommand("chmod 744 " + path);
 
原文链接:https://blog.csdn.net/WatsonYee/article/details/82389769

发布了40 篇原创文章 · 获赞 57 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/With__Sunshine/article/details/105244681