1、文件上传模块集成ftp功能并测试实现

pull/254/head
xjs 4 years ago
parent 2e07b49209
commit 0158b62f88

@ -46,6 +46,7 @@
<knife4j.version>3.0.3</knife4j.version>
<hutool.version>5.7.17</hutool.version>
<mybatisplus.version>3.4.3.4</mybatisplus.version>
<commonsNet.version>3.6</commonsNet.version>
</properties>

@ -125,11 +125,20 @@
<artifactId>swagger-annotations</artifactId>
</dependency>
<!--xjs-->
<!--hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--lombok简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

@ -54,6 +54,13 @@
<version>${minio.version}</version>
</dependency>
<!--FTP-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commonsNet.version}</version>
</dependency>
<!-- RuoYi Api System -->
<dependency>
<groupId>com.ruoyi</groupId>

@ -0,0 +1,52 @@
package com.ruoyi.file.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* ftp
* @author xiejs
* @since 2022-01-24
*/
@Component
@ConfigurationProperties(prefix = "ftp")
@Data
public class FtpProperties {
/**
*
*/
private String port;
/**
*
*/
private String user;
/**
*
*/
private String password;
/**
* ftpip
*/
private String serverIp;
/**
* ftp
*/
private String path;
/**
*
*/
private String domain;
/**
*
*/
private String prefix;
}

@ -1,12 +1,13 @@
package com.ruoyi.file.config;
import java.io.File;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.io.File;
/**
*
*
@ -27,12 +28,29 @@ public class ResourcesConfig implements WebMvcConfigurer
@Value("${file.prefix}")
public String localFilePrefix;
/**
* ftp
*/
@Value("${ftp.path}")
private String ftpPath;
/**
* ftp
*/
@Value("${ftp.prefix}")
public String ftpFilePrefix;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry.addResourceHandler(ftpFilePrefix + "/**")
.addResourceLocations("file:" + ftpPath + File.separator);
/** 本地文件上传路径 */
registry.addResourceHandler(localFilePrefix + "/**")
.addResourceLocations("file:" + localFilePath + File.separator);
}
/**

@ -0,0 +1,41 @@
package com.ruoyi.file.service;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.file.config.FtpProperties;
import com.ruoyi.file.utils.FileUploadUtils;
import com.ruoyi.file.utils.FtpUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;
/**
* FTP
* @author xiejs
* @since 2022-01-24
*/
@Service
@Primary
public class FtpSysFileServiceImpl implements ISysFileService{
@Autowired
private FtpUtils ftpUtils;
@Autowired
private FtpProperties ftpProperties;
@Override
public String uploadFile(MultipartFile file) throws Exception {
Assert.notNull(file, "file is null");
String extension = FileUploadUtils.getExtension(file);
String url = "";
String fileName = UUID.randomUUID() + "." + extension;
boolean uploadResult = ftpUtils.uploadFile(String.valueOf(DateUtil.thisYear()),fileName , file.getInputStream());
if (uploadResult) {
url = ftpProperties.getDomain() + ftpProperties.getPrefix() +"/"+DateUtil.thisYear()+"/"+ fileName;
}
return url;
}
}

@ -1,17 +1,15 @@
package com.ruoyi.file.service;
import com.ruoyi.file.utils.FileUploadUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.file.utils.FileUploadUtils;
/**
*
*
* @author ruoyi
*/
@Primary
@Service
public class LocalSysFileServiceImpl implements ISysFileService
{

@ -0,0 +1,118 @@
package com.ruoyi.file.utils;
import cn.hutool.extra.ftp.Ftp;
import com.ruoyi.file.config.FtpProperties;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
/**
* ftp
* @author xjs
* @since 2022-01-24 16:49:40
*/
@Component
public class FtpUtils {
private Ftp ftp = null;
private static final Logger logger = LoggerFactory.getLogger(FtpUtils.class);
public static String LOCAL_CHARSET = "GBK";
@Autowired
private FtpProperties ftpProperties;
public Ftp instance() {
if (ftp != null) {
ftp.reconnectIfTimeout();
} else {
String ftpServerIp = ftpProperties.getServerIp();
String ftpServerAccount = ftpProperties.getUser();
String ftpServerPassword = ftpProperties.getPassword();
String ftpServerPort = ftpProperties.getPort();
synchronized (this) {
if (StringUtils.isBlank(ftpServerPassword) || StringUtils.isBlank(ftpServerAccount)) {
ftp = new Ftp(ftpServerIp, Integer.parseInt(ftpServerPort));
} else {
ftp = new Ftp(ftpServerIp, Integer.parseInt(ftpServerPort), ftpServerAccount, ftpServerPassword);
}
ftp.setBackToPwd(true);
logger.info("login ftp server with {}:{}@{}:{}", ftpServerIp, Integer.parseInt(ftpServerPort), ftpServerAccount, ftpServerPassword);
setClientCharacter();
}
}
return ftp;
}
private void setClientCharacter() {
FTPClient ftpClient = ftp.getClient();
ftpClient.setControlKeepAliveTimeout(60);
try {
int command = ftpClient.sendCommand("OPTS UTF8", "ON");
if (FTPReply.isPositiveCompletion(command)) {
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
} catch (Exception exception) {
throw new RuntimeException("获取ftp服务编码格式异常", exception.getCause());
}
}
public boolean existFile(String filePath) {
return instance().existFile(filePath);
}
public boolean delFile(String filePath) {
return instance().delFile(filePath);
}
public boolean delDir(String dirPath) {
return instance().delDir(dirPath);
}
public boolean mkDir(String dirPath) {
return instance().mkdir(dirPath);
}
public List<FTPFile> lsFiles(String dirPath) {
FTPFile[] ftpFiles = instance().lsFiles(dirPath);
return Arrays.asList(ftpFiles);
}
public boolean uploadFile(String path, String fileName, File file) {
return instance().upload(path, fileName, file);
}
public boolean uploadFile(String path, String fileName, InputStream inputStream) {
return instance().upload(path, fileName, inputStream);
}
public void download(String path, String fileName, OutputStream outputStream) {
instance().download(path, fileName, outputStream);
}
public boolean close() {
try {
if (ftp != null) {
ftp.close();
}
return true;
} catch (Exception exception) {
logger.error("error close ftp: " + exception.getCause());
return false;
}
}
}

@ -8,6 +8,7 @@
<version>3.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<name>业务模块-爬虫模块</name>
<artifactId>xjs-business-webmagic</artifactId>

@ -0,0 +1,30 @@
package com.xjs.handler;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
/**
*
* @author xiejs
* @since 2022-01-24
*/
public class MiHoYoRepoPageProcessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
@Override
public void process(Page page) {
}
@Override
public Site getSite() {
return site;
}
}
Loading…
Cancel
Save