首先添加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服务器
点击编辑权限
选中安全标签栏
点击编辑
点击添加
点击高级然后点立即查找
选中你想修改权限的用户例如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;
}
}
啦啦啦~