搭建一个属于自己的文件服务器从虚拟机的安装到项目测试(完结篇)

1.数据库表接口设计

java 搭建服务器 java文件服务器搭建_User

2.项目设计

使用springboot+mybatisPlus

java 搭建服务器 java文件服务器搭建_User_02

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: /项目名称...

新建连接(可选)

java 搭建服务器 java文件服务器搭建_User_03


输入对应的信息

java 搭建服务器 java文件服务器搭建_java_04


开始反向生成

java 搭建服务器 java文件服务器搭建_linux_05


在下图几次根据自己的需求进行更改

java 搭建服务器 java文件服务器搭建_上传_06


java 搭建服务器 java文件服务器搭建_上传_07


java 搭建服务器 java文件服务器搭建_linux_08

实体类:

@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目录下没有任何文件

java 搭建服务器 java文件服务器搭建_java 搭建服务器_09


接下来运行项目 上传文件

java 搭建服务器 java文件服务器搭建_java_10


这样就上传成功了,我们去数据库和xftp查看有没有保存进去

java 搭建服务器 java文件服务器搭建_linux_11


java 搭建服务器 java文件服务器搭建_java_12

java 搭建服务器 java文件服务器搭建_上传_13


都保存进去了,接下来复制链接去浏览器浏览

java 搭建服务器 java文件服务器搭建_上传_14