Ftp服务器上传/删除/下载图片文件示例

原文URL:https://blog.csdn.net/jiulanhao/article/details/80899035

首先添加pom.xml的依赖

 <dependency>
     <groupId>commons-net</groupId>
     <artifactId>commons-net</artifactId>
     <version>3.3</version>
 </dependency>
之后找个ftp上传工具类

package com.cn.sola.utils;
 
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.stereotype.Component;
 
import java.io.IOException;
import java.io.InputStream;
 
/**
 * FtpUtil工具类 ftp文件上传类
 *
 */
@Component
public class FtpUtil {
 
    //ftp服务器ip地址
    private static final String FTP_ADDRESS = "192.168.226.137";
    //端口号
    private static final int FTP_PORT = 21;
    //用户名
    private static final String FTP_USERNAME = "ftpimage";
    //密码
    private static final String FTP_PASSWORD = "Sola1224";
    //图片路径
    public final String FTP_BASEPATH = "C:\\solaphototest";
 
    public boolean uploadFile(String originFileName, InputStream input) {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {//判断ftp连接是否可用,源码中判断200>=reply<=300为可用,用户名密码错误为503
                ftp.disconnect();
                return success;
            }
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftp.makeDirectory(FTP_BASEPATH);
            ftp.changeWorkingDirectory(FTP_BASEPATH);
            success = ftp.storeFile(originFileName, input);
            input.close();
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }
}
这个基本拿来用就可以

之后写一个测试类小测试一下

package com.cn.sola;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
 
import com.cn.sola.utils.FtpUtil;
 
@RunWith(SpringRunner.class)
@SpringBootTest
public class FtpTestApplicationTests {
 
    @Test
    public void contextLoads() {
      try {
        FileInputStream fs = new FileInputStream("E:\\ftptest\\itest.jpeg");
        
        new FtpUtil().uploadFile("httest.jpeg", fs);
        
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
 
}
上传就这么简单的完成啦

但是删除会有一些小坑,删除很简单 只要在稍微修改一下工具类就可以,但是我开始却失败了,我以为是代码的问题

结果最后忘了一件事情,那就是ftpimage默认只有读写权限没有删除权限,所要给与他删除权限才可以删除文件

首先右键ftp服务器

点击编辑权限

选中安全标签栏

点击编辑

点击添加

点击高级然后点立即查找

选中你想修改权限的用户例如ftpimage,选中会如下图

点击下图的权限列表就可以设置角色权限了

权限设置完成

下面就可以删除了 下面是删除代码

package com.cn.sola.utils;
 
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.stereotype.Component;
 
import java.io.IOException;
import java.io.InputStream;
 
/**
 * FtpUtil工具类 ftp文件上传类
 *
 */
@Component
public class FtpUtil {
 
    //ftp服务器ip地址
    private static final String FTP_ADDRESS = "192.168.226.137";
    //端口号
    private static final int FTP_PORT = 21;
    //用户名
    private static final String FTP_USERNAME = "ftpimage";
    //密码
    private static final String FTP_PASSWORD = "Sola1224";
    //图片路径
    public final String FTP_BASEPATH = "C:\\solaphototest";
 
    public boolean uploadFile(String originFileName, InputStream input) {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftp.makeDirectory(FTP_BASEPATH);
            ftp.changeWorkingDirectory(FTP_BASEPATH);
            success = ftp.storeFile(originFileName, input);
            input.close();
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }
    public boolean deleteFile(String FileName) {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftp.makeDirectory(FTP_BASEPATH);
            ftp.changeWorkingDirectory(FTP_BASEPATH);
            success = ftp.deleteFile(FileName);
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }
 
}
聪明的同学已经看出来我把新增和删除都写到了一个工具类,设置全一样 就是ftp调用的方法不一样

ftp已经封装好了方法

那么下面是一个小测试类

package com.cn.sola;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
 
import com.cn.sola.utils.FtpUtil;
 
@RunWith(SpringRunner.class)
@SpringBootTest
public class FtpTestApplicationTests {
 
    @Autowired
    private FtpUtil ftputil;
    
    @Test
    public void contextLoads() {
 
        boolean deleteFile = ftputil.deleteFile("httest.jpeg");
        
        System.out.println(deleteFile);
        }
}
去测试删除没删除成功吧~~~~~~~~~

下面是一个springboot上传到ftp的小实例

controller

    @PostMapping("addphoto")
    @ApiOperation("新增占地施工图例")
    public String addPhoto(MultipartFile image){
        return roadworkservice.addPhoto(image);
    }
service

public String addPhoto(MultipartFile image) {
        // TODO Auto-generated method stub
        try{
            String file = UUID.randomUUID().toString();
            //获取文件全名
            String originalFilename = image.getOriginalFilename();
            //获取传入文件后缀名
            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            
            InputStream inputStream = image.getInputStream();
            
            String uuidfilename=file+"."+suffix;
            //上传
            boolean uploadFile = new FtpUtil().uploadFile(uuidfilename, inputStream);
            
            if(uploadFile){
                
                String url="http://192.168.66.63:18080/sola/"+uuidfilename;
                
                return url;
                
            }
        }catch (Exception e) {
            log.error("addPhoto————添加占路施工图例异常: ");
            log.error(e.getMessage());
        }
        return null;
    }
就四则样子杆单。

Springboot上传默认图片大小的1MB

所以想要传入更大的文件得对application.properties做出设置

spring.http.multipart.max-file-size=100mb
spring.http.multipart.max-request-size=500mb
第一个是设置单个文件的最大大小,第二个是总的大小

——————————————————————————————————————————————————————

再添加一个文件的下载

package com.sola.utils;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
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;
 
public class FtpDownLoad {
    /**
    * 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 boolean downFile(String url, int port,String username, String password, String remotePath,String fileName,String localPath) { 
        boolean success = false; 
        FTPClient ftp = new FTPClient(); 
        try { 
            int reply; 
            ftp.connect(url, port); 
            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 
            ftp.login(username, password);//登录 
            reply = ftp.getReplyCode(); 
            if (!FTPReply.isPositiveCompletion(reply)) { 
                ftp.disconnect(); 
                return success; 
            } 
            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(); 
            success = true; 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } finally { 
            if (ftp.isConnected()) { 
                try { 
                    ftp.disconnect(); 
                } catch (IOException ioe) { 
                } 
            } 
        } 
        return success; 
    }
}
然后我再springboot写个接口调用一下

    @GetMapping("download")
    @ApiOperation("文件下载")
    public boolean download(){
        
        //ftp服务器ip地址
        final String FTP_ADDRESS = "192.168.226.138";
        //端口号
        final int FTP_PORT = 21;
        //用户名
        final String FTP_USERNAME = "ftpimage";
        //密码
        final String FTP_PASSWORD = "Sola1224";
        
        try {
            
            FtpDownLoad ftpDownLoad = new FtpDownLoad();
            
            ftpDownLoad.downFile(FTP_ADDRESS, FTP_PORT, FTP_USERNAME, FTP_PASSWORD, "solatestupdate", "593c1462-1d24-449e-b821-6536587e478e.jpg", "D:\\");
            
            return true;
        } catch (Exception e) {
            return false;
        }

猜你喜欢

转载自blog.csdn.net/heng_yan/article/details/88971200