完善 yudao-spring-boot-starter-file 组件,支持 S3 对接云存储、local、ftp、sftp 等协议
parent
ed53ca3de9
commit
3d40fc81dd
@ -0,0 +1,59 @@
|
|||||||
|
package cn.iocoder.yudao.framework.file.core.client.impl.ftp;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.FileClientConfig;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.hibernate.validator.constraints.URL;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ftp 文件客户端的配置类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class FtpFileClientConfig implements FileClientConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础路径
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "基础路径不能为空")
|
||||||
|
private String basePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义域名
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "domain 不能为空")
|
||||||
|
@URL(message = "domain 必须是 URL 格式")
|
||||||
|
private String domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主机地址
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "host 不能为空")
|
||||||
|
private String host;
|
||||||
|
/**
|
||||||
|
* 主机端口
|
||||||
|
*/
|
||||||
|
@NotNull(message = "port 不能为空")
|
||||||
|
private Integer port;
|
||||||
|
/**
|
||||||
|
* 用户名
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "用户名不能为空")
|
||||||
|
private String username;
|
||||||
|
/**
|
||||||
|
* 密码
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "密码不能为空")
|
||||||
|
private String password;
|
||||||
|
/**
|
||||||
|
* 连接模式
|
||||||
|
*
|
||||||
|
* 使用 {@link cn.hutool.extra.ftp.FtpMode} 对应的字符串
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "连接模式不能为空")
|
||||||
|
private String mode;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
package cn.iocoder.yudao.framework.file.core.client.impl.local;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.FileClientConfig;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.hibernate.validator.constraints.URL;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 本地文件客户端的配置类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LocalFileClientConfig implements FileClientConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础路径
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "基础路径不能为空")
|
||||||
|
private String basePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义域名
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "domain 不能为空")
|
||||||
|
@URL(message = "domain 必须是 URL 格式")
|
||||||
|
private String domain;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
package cn.iocoder.yudao.framework.file.core.client.impl.sftp;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.FileClientConfig;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.hibernate.validator.constraints.URL;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sftp 文件客户端的配置类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class SftpFileClientConfig implements FileClientConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础路径
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "基础路径不能为空")
|
||||||
|
private String basePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义域名
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "domain 不能为空")
|
||||||
|
@URL(message = "domain 必须是 URL 格式")
|
||||||
|
private String domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主机地址
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "host 不能为空")
|
||||||
|
private String host;
|
||||||
|
/**
|
||||||
|
* 主机端口
|
||||||
|
*/
|
||||||
|
@NotNull(message = "port 不能为空")
|
||||||
|
private Integer port;
|
||||||
|
/**
|
||||||
|
* 用户名
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "用户名不能为空")
|
||||||
|
private String username;
|
||||||
|
/**
|
||||||
|
* 密码
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "密码不能为空")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
package cn.iocoder.yudao.framework.file.core.client.ftp;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.resource.ResourceUtil;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.extra.ftp.FtpMode;
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.impl.ftp.FtpFileClient;
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.impl.ftp.FtpFileClientConfig;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class FtpFileClientTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
// 创建客户端
|
||||||
|
FtpFileClientConfig config = new FtpFileClientConfig();
|
||||||
|
config.setDomain("http://127.0.0.1:48080");
|
||||||
|
config.setBasePath("/home/ftp");
|
||||||
|
config.setHost("kanchai.club");
|
||||||
|
config.setPort(221);
|
||||||
|
config.setUsername("");
|
||||||
|
config.setPassword("");
|
||||||
|
config.setMode(FtpMode.Passive.name());
|
||||||
|
FtpFileClient client = new FtpFileClient(0L, config);
|
||||||
|
client.init();
|
||||||
|
// 上传文件
|
||||||
|
String path = IdUtil.fastSimpleUUID() + ".jpg";
|
||||||
|
byte[] content = ResourceUtil.readBytes("file/erweima.jpg");
|
||||||
|
String fullPath = client.upload(content, path);
|
||||||
|
System.out.println("访问地址:" + fullPath);
|
||||||
|
if (false) {
|
||||||
|
byte[] bytes = client.getContent(path);
|
||||||
|
System.out.println("文件内容:" + bytes);
|
||||||
|
}
|
||||||
|
if (false) {
|
||||||
|
client.delete(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package cn.iocoder.yudao.framework.file.core.client.local;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.resource.ResourceUtil;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.impl.local.LocalFileClient;
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.impl.local.LocalFileClientConfig;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class LocalFileClientTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
// 创建客户端
|
||||||
|
LocalFileClientConfig config = new LocalFileClientConfig();
|
||||||
|
config.setDomain("http://127.0.0.1:48080");
|
||||||
|
config.setBasePath("/Users/yunai/file_test");
|
||||||
|
LocalFileClient client = new LocalFileClient(0L, config);
|
||||||
|
client.init();
|
||||||
|
// 上传文件
|
||||||
|
String path = IdUtil.fastSimpleUUID() + ".jpg";
|
||||||
|
byte[] content = ResourceUtil.readBytes("file/erweima.jpg");
|
||||||
|
String fullPath = client.upload(content, path);
|
||||||
|
System.out.println("访问地址:" + fullPath);
|
||||||
|
client.delete(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.framework.file.core.client.sftp;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.resource.ResourceUtil;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.impl.sftp.SftpFileClient;
|
||||||
|
import cn.iocoder.yudao.framework.file.core.client.impl.sftp.SftpFileClientConfig;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class SftpFileClientTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
// 创建客户端
|
||||||
|
SftpFileClientConfig config = new SftpFileClientConfig();
|
||||||
|
config.setDomain("http://127.0.0.1:48080");
|
||||||
|
config.setBasePath("/home/ftp");
|
||||||
|
config.setHost("kanchai.club");
|
||||||
|
config.setPort(222);
|
||||||
|
config.setUsername("");
|
||||||
|
config.setPassword("");
|
||||||
|
SftpFileClient client = new SftpFileClient(0L, config);
|
||||||
|
client.init();
|
||||||
|
// 上传文件
|
||||||
|
String path = IdUtil.fastSimpleUUID() + ".jpg";
|
||||||
|
byte[] content = ResourceUtil.readBytes("file/erweima.jpg");
|
||||||
|
String fullPath = client.upload(content, path);
|
||||||
|
System.out.println("访问地址:" + fullPath);
|
||||||
|
if (false) {
|
||||||
|
byte[] bytes = client.getContent(path);
|
||||||
|
System.out.println("文件内容:" + bytes);
|
||||||
|
}
|
||||||
|
if (false) {
|
||||||
|
client.delete(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue