搭建一个属于自己的文件服务器从虚拟机的安装到项目测试(完结篇)
1.数据库表接口设计
2.项目设计
使用springboot+mybatisPlus
pom.xml
<properties>
<java.version>1.8</java.version>
<mybatis.plus.boot.version>3.2.0</mybatis.plus.boot.version>
<lombok.version>1.18.8</lombok.version>
</properties>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.boot.version}</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<!-- 时间操作组件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.51</version>
</dependency>
<!-- jsch 所依赖的jar包 -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jzlib</artifactId>
<version>1.0.7</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
配置文件 application.yml
这个配置文件是按照你自己的数据库,跟创建的包名来设置的 请详情对照,配置 注意带有“…”的这个是提示应该修改的位置
#配置数据库连接信息
spring:
datasource:
url: jdbc:mysql:///数据库名称...?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&useSSL=false
username: 你的数据库用户名...
password: 密码...
driver-class-name: com.mysql.cj.jdbc.Driver
#Mybatis扫描接口对应的xml文件
mybatis-plus:
mapper-locations: classpath*: xxx/*.xml
#起别名。可省略写mybatis的xml中的resultType的全路径
type-aliases-package: 你的mapper的全路径... 例如com.xxx.xxx.xxx
configuration:
mapUnderscoreToCamelCase: true
#配置文件上传器
Spring:
http:
multipart:
maxFileSize: 100Mb
maxRequestSize: 100Mb
mvc:
view:
prefix: /pages/
suffix: .html
#ftp相关配置
FTP:
ADDRESS: 虚拟机的ip地址...
PORT: 22
USERNAME: 前面新创建的用户...
PASSWORD: 用户的密码...
BASEPATH: /home/ftpuser/images
IMAGE:
BASE:
URL: http://你的ip地址.../images
server:
port: 项目的端口...
servlet:
context-path: /项目名称...
新建连接(可选)
输入对应的信息
开始反向生成
在下图几次根据自己的需求进行更改
实体类:
@Data
@TableName(value = "user")
public class User implements Serializable {
@TableId(value = "id", type = IdType.INPUT)
private String id;
@TableField(value = "username")
private String username;
@TableField(value = "password")
private String password;
@TableField(value = "picture")
private String picture;
private static final long serialVersionUID = 1L;
dao层
这个接口要加mapper注解,或者去启动类上面价格mapperscan注解扫描包
UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper<User> {
int insert(User user);
}
UserMapper.xml
<insert id="insert">
insert into user value (#{id},#{username},#{password},#{picture})
</insert>
service层
接口:
public interface UserService extends IService<User>{
int insert(User user);
}
实现类:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public int insert(User user) {
return userMapper.insert(user);
}
}
工具类
IDUtils
public final class RandomUtil {
/**
* 返回一个UUID
*
* @return 大写的UUID
*/
public static String UUID() {
UUID uuid = UUID.randomUUID();
String s = uuid.toString();
String temp = s.substring(0, 8) + s.substring(9, 13) +
s.substring(14, 18) + s.substring(19, 23) + s.substring(24);
return temp.toUpperCase();
}
}
FtpUtils
public class FtpUtils {
private static ChannelSftp sftp = null;
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器ip
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录,/home/ftpuser/images
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
File file=null;
try {
JSch jsch = new JSch();
//获取sshSession 账号-ip-端口
Session sshSession = jsch.getSession(username, host, port);
//添加密码
sshSession.setPassword(password);
Properties sshConfig = new Properties();
//严格主机密钥检查
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
//开启sshSession链接
sshSession.connect();
//获取sftp通道
Channel channel = sshSession.openChannel("sftp");
//开启
channel.connect();
sftp = (ChannelSftp) channel;
file=new File(basePath);
//进入服务器主导模式
ftp.enterLocalPassiveMode();
//设置上传文件的类型为二进制类型
//进入到要上传的目录 然后上传文件
sftp.cd(basePath);
sftp.put(input,filename);
input.close();
result = true;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
web层
@RestController
public class UserController {
@Value("${FTP.ADDRESS}")
private String host;
// 端口
@Value("${FTP.PORT}")
private int port;
// ftp用户名
@Value("${FTP.USERNAME}")
private String userName;
// ftp用户密码
@Value("${FTP.PASSWORD}")
private String passWord;
// 文件在服务器端保存的主目录
@Value("${FTP.BASEPATH}")
private String basePath;
// 访问图片时的基础url
@Value("${IMAGE.BASE.URL}")
private String baseUrl;
@Autowired
private UserService userService;
@RequestMapping("/pictureUpload")
public String pictureUpload(
@RequestParam("pic") MultipartFile uploadFile,
@RequestParam("username")String username,
@RequestParam("password") String password) {
try {
//1、给上传的图片生成新的文件名
//1.1获取原始文件名
String oldName = uploadFile.getOriginalFilename();
//1.2使用IDUtils工具类生成新的文件名,新文件名 = newName + 文件后缀
String newName = IDUtils.genImageName();
newName = newName + oldName.substring(oldName.lastIndexOf("."));
//2、把前端输入信息,包括图片的url保存到数据库
User user = new User();
user.setId(RandomUtil.UUID());
user.setUsername(username);
user.setPassword(password);
user.setPicture(baseUrl + "/" + newName);
userService.insert(user);
//3、把图片上传到图片服务器
//3.1获取上传的io流
InputStream input = uploadFile.getInputStream();
//3.2调用FtpUtil工具类进行上传
boolean result = FtpUtils.uploadFile(host, port, userName, passWord, basePath, newName, input);
if(result) {
return "上传成功";
}else {
return "上传失败";
}
} catch (IOException e) {
return "IO异常";
}
}
index.html
将index.html放在源文件下的static文件夹下,没有static就自己新建一个
要更改form表单的action属性,项目名改为配置文件中自己修改的项目名
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/项目名/pictureUpload" enctype="multipart/form-data" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="file" name="pic"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
测试
打开xftp 看看刚刚连接的目录结构,ftpuser目录下没有任何文件
接下来运行项目 上传文件
这样就上传成功了,我们去数据库和xftp查看有没有保存进去
都保存进去了,接下来复制链接去浏览器浏览