1.为什么使用FTP服务器?
其实我们完全可以通过http上传文件或者图片,后台用tomcat接收流,然后保存到服务器的磁盘的某个位置,前端再通过请求后端接口,后台再将文件转化流传到前端,从而完成文件上传下载功能。
那为什么我们还要ftp服务器?ftp协议是相对于http协议的一种文件传输协议。这种协议在文件大于1M是时的传输速度是大于http协议。通过对ftp服务器的构建可以使文件独立存放。通过下载ftp客户端可方便进行文件的管理。安全性高,可以进行数据的加密传输。
2.实现思路
3.代码示例
@Component
public class FTPUtils {
private static final Logger logger = LoggerFactory.getLogger(FTPUtils.class);
@Value("${ftp.url}")
private String ftpURL;
@Value("${ftp.port}")
private int ftpPort;
@Value("${ftp.username}")
private String ftpUsername;
@Value("${ftp.password}")
private String ftpPassword;
@Value("${ftp.directory}")
private String ftpDirectory;
@Value("${nginx.url}")
private String nginxUrl;
private FTPClient ftpClient;
public void connect() throws IOException {
FTPClient ftpClient1 = new FTPClient();
logger.info("connecting ftpserver .."+ftpURL);
ftpClient1.connect(ftpURL, ftpPort);
ftpClient1.login(ftpUsername, ftpPassword);
ftpClient1.changeWorkingDirectory(ftpDirectory);
ftpClient1.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient1.setDataTimeout(30000);
ftpClient1.setConnectTimeout(30000);
ftpClient = ftpClient1;
}
public String storeImg(InputStream inputStream) throws IOException {
String fileName = generateRandomFilename();
ftpClient.storeFile(fileName + ".jpg", inputStream);
String imgUrl = nginxUrl + fileName + ".jpg";
return imgUrl;
}
public void logout() throws IOException {
if (null != ftpClient) {
ftpClient.logout();
}
}
private String generateRandomFilename() {
String RandomFilename = "";
Random rand = new Random();//生成随机数
int random = rand.nextInt();
Calendar calCurrent = Calendar.getInstance();
int intDay = calCurrent.get(Calendar.DATE);
int intMonth = calCurrent.get(Calendar.MONTH) + 1;
int intYear = calCurrent.get(Calendar.YEAR);
String now = String.valueOf(intYear) + "_" + String.valueOf(intMonth) + "_" +
String.valueOf(intDay) + "_";
RandomFilename = now + String.valueOf(random > 0 ? random : (-1) * random);
return RandomFilename;
}
public String storeAttachment(String name, InputStream inputStream) throws IOException {
ftpClient.storeFile(name, inputStream);
StringBuilder stringBuilder = new StringBuilder();
String ftpUrl = stringBuilder.append("ftp://").append(ftpURL).append("/pub/").append(name).toString();
return ftpUrl;
}
public boolean isConnect(){
if (null != ftpClient) {
boolean connected = ftpClient.isConnected();
return connected;
}
return false;
}
public void disConnect() throws IOException {
ftpClient.disconnect();
}
}