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

首先添加pom.xml的依赖

 
     commons-net
     commons-net
     3.3
 

之后找个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服务器

点击编辑权限

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

选中安全标签栏

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

点击编辑

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

点击添加

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

点击高级然后点立即查找

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

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

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

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

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

权限设置完成

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

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;
		}
		
	}

啦啦啦~

你可能感兴趣的:(ftp)