自己动手写一个java版简单云相册

yizhihongxing

如何自己动手写一个java版简单云相册?

在这个攻略中我们将使用Spring Boot和Thymeleaf模板引擎来搭建一个简单的云相册,允许用户上传并分享自己的照片。以下是该应用程序的主要功能:

  • 用户可以在相册中上传自己的照片
  • 用户可以查看所有已上传的照片
  • 用户可以通过链接轻松共享照片
  • 未登录的用户无法上传照片

接下来,让我们一起进行这个项目的实现吧。

第一步:创建Spring Boot应用程序

首先,我们需要安装并配置好Java和Maven,然后创建一个Spring Boot项目。在命令行输入以下命令:

$ mvn spring-boot:run

这将启动一个简单的Spring Boot应用程序,并在浏览器中打开localhost:8080。我们将在下一个步骤中进行更改以创建相册。

第二步:添加照片上传功能

我们需要添加一个视图来允许用户上传照片。

在resource目录下创建一个名为tempate的文件夹,然后在该文件夹中创建一个名为"upload.html"的文件。在该html文件中添加以下代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Upload Photo</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data" th:action="@{/upload}">
        <input type="file" name="file" id="file"/>
        <input type="submit" value="Submit"/>
    </form>
</body>
</html>

这会创建一个简单的HTML表单,允许用户上传照片。现在我们需要创建一个控制器,让Spring Boot直接从文件系统上加载和保存上传的照片。

在package根目录下创建一个名为"controller"的子目录,然后在其中添加一个名为"PhotoController.java"的文件。该文件的内容如下:

@Controller
public class PhotoController {

    private static String UPLOAD_DIR = System.getProperty("user.dir") + "/uploads";

    @GetMapping("/upload")
    public String index() {
        return "upload";
    }

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) {
        try {
            Path fileLocation = Paths.get(UPLOAD_DIR + File.separator + file.getOriginalFilename());
            Files.copy(file.getInputStream(), fileLocation, StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "redirect:/";
    }
}

这个类中,@GetMapping注释将我们的控制器方法映射到“/upload”路径,它将显示一个能够上传文件的表单。@PostMapping注释指定了它将的处理HTTP POST请求,即上传文件。我们使用Java NIO的Path和Files类以及MultipartFile类的方法来将上传的文件从表单中读取并写入磁盘。

第三步:展示所有照片

我们需要一个控制器来检索并显示已上传的所有照片。在"controller"目录中创建一个名为"GalleryController.java"的文件,将以下代码添加到其中:

@Controller
public class GalleryController {

    private static String UPLOAD_DIR = System.getProperty("user.dir") + "/uploads";

    @GetMapping("/")
    public String index(Model model) {
        File[] files = new File(UPLOAD_DIR).listFiles();

        // Add the file names to a list
        List<String> filenames = new ArrayList<>();
        for (File file : files) {
            if (file.isFile()) {
                filenames.add(file.getName());
            }
        }

        model.addAttribute("data", filenames);
        return "index";
    }
}

该控制器负责从文件系统中读取照片,并将文件名存储在一个List中,然后将List传递给前端以便展示。

在resource/template目录中创建一个名为"index.html"的文件,加入以下代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Gallery</title>
</head>
<body>
    <h1>Welcome to the Gallery</h1>
    <div th:each="pic : ${data}">
        <a th:href="@{'/uploads/' + ${pic}}"><img src="@{'/uploads/' + ${pic}}" width="200"/></a>
    </div>
</body>
</html>

@{...}用于链接到静态资源。这将从/uploads目录中获取照片并在前端显示它们。

第四步:添加安全性

访问GalleryController中的"/upload"路径时,我们希望仅允许已登录用户才能上传照片。为此,我们将在以下类中添加Spring Security:com.example.demo.SecurityConfiguration。

在本项目中,我们使用基于内存的认证管理器。在SecurityConfiguration.java文件中,我们将定义一个包含用户名、密码和角色的映射,以及一个PasswordEncoder作为密码编码器。

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user")
                .password(passwordEncoder().encode("password"))
                .roles("USER");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/upload").hasRole("USER")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login").permitAll();
    }
}

然后,在security中创建一个login.html页面,对应于Spring Security中的登录页。该页面包含用于输入用户名和密码的输入框、登录按钮和取消按钮,如下所示:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
    <meta charset="UTF-8">
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-4 col-md-offset-4">
            <h1> Please Login </h1>

            <form th:action="@{/login}" method="post">
                <input type="text" id="username" name="username" placeholder="Username"  autofocus/>

                <input type="password" id="password" name="password" placeholder="Password"/>

                <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
                <a href="#" class="btn btn-lg btn-default btn-block">Cancel</a>
            </form>
        </div>
    </div>
</div>
</body>
</html>

第五步:结束语

本文教程我们学习了如何使用Spring Boot和Thymeleaf构建一个非常简单的云相册。该应用程序允许用户上传照片、查看已上传的照片,并限制未授权用户的访问。通过本篇文章的学习,相信您已经掌握了Spring Boot和Thymeleaf的编程技巧,希望您们能在此基础上,完成更优美的云相册的应用开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:自己动手写一个java版简单云相册 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • javascript判断两个IP地址是否在同一个网段的实现思路

    实现IP地址判断是否在同一个网段,可以使用Javascript实现的思路如下: 首先将IP地址转换成二进制格式,方便进行比较,然后将子网掩码也转换成二进制格式。 对转换后的IP地址和子网掩码进行&(与运算),得到的结果就是该IP地址所在的网络地址。 将要比较的两个IP地址按照以上步骤进行转换得到两个网络地址。 比较两个网络地址是否相同,如果相同,则说…

    JavaScript 2023年6月11日
    00
  • JavaScript高级编程之Array的用法总结

    JavaScript高级编程之Array的用法总结 1. Array是什么? 在JavaScript中,Array是一种用来存储和操作一组值的有序集合,可以容纳多种类型的数据,并且可以动态扩展大小。Array是JavaScript编程中最常用的数据类型之一,也是编写JavaScript程序时必须掌握的重要内容之一。 2. Array的常用方法 2.1 增加和…

    JavaScript 2023年5月27日
    00
  • JavaScript高级程序设计(第3版)学习笔记11 内建js对象

    下面是《JavaScript高级程序设计(第3版)学习笔记11 内建js对象》的学习攻略。 常用内建对象 JavaScript中内建对象众多,本章介绍的是一些常用的内建对象。 Boolean对象 Boolean对象只有两种可能的实例,即true和false,如果将其他数据类型转换为Boolean类型,规则是:除了””、0、NaN、null和undefined…

    JavaScript 2023年5月18日
    00
  • JS实现二维数组元素的排列组合运算简单示例

    下面是详细讲解“JS实现二维数组元素的排列组合运算简单示例”的完整攻略。 什么是排列组合运算 排列组合运算是指在一组数据中,选择若干个元素进行排列或组合的处理过程。其中,“排列”指所有元素的顺序不同,而“组合”指所有元素的顺序相同。 例如,对于数据集合 {a, b, c},若选择 2 个元素进行排列,则可能的组合情况为: ab, ac, ba, bc, ca…

    JavaScript 2023年5月28日
    00
  • js实现页面多个日期时间倒计时效果

    JS实现页面多个日期时间倒计时效果的攻略如下: 1. 获取倒计时目标时间 首先,我们需要通过JS获取到倒计时的目标时间。目标时间可以通过后端接口获取,也可以通过前端手动指定。我们可以使用Date对象,把目标时间转化为时间戳,之后再与当前时间的时间戳作差,得到剩余时间。 // 获取目标时间 let targetTime = new Date(‘2022-01-…

    JavaScript 2023年5月27日
    00
  • 在JavaScript中处理字符串之fontcolor()方法的使用

    在JavaScript中处理字符串之fontcolor()方法的使用 简介 JavaScript 提供了一些内置方法,用来处理字符串,其中之一就是 fontcolor() 。 fontcolor() 方法用于创建带有指定颜色的 HTML <font> 标签,用于改变文本颜色。 该方法接受一个参数 color,该参数是一个字符串,值为想要应用的颜色…

    JavaScript 2023年5月28日
    00
  • javascript 特性检测并非浏览器检测

    JavaScript特性检测是一种技术,用于检测一个网站或应用程序是否支持所需的特定JavaScript特性。与浏览器检测不同,它测试一个特定的功能是否可用,而浏览器检测则简单地表明用户使用的浏览器。 下面是进行JavaScript特性检测的攻略: 步骤 1.判断所需功能是否可用: 首先,确定您需要的功能是否可用。这通常涉及询问JavaScript环境的功能…

    JavaScript 2023年6月11日
    00
  • Javascript Global parseFloat() 函数

    JavaScript Global对象中的parseFloat()函数用于将一个字符串解析为浮点数。如果该字符串无法解析为浮点数,则返回NaN。以下是关于parseFloat()函数完整攻略,包括两个示例说明。 JavaScript Global对象中的parseFloat()函数 JavaScript Global对象中的parseFloat()函数用于将…

    JavaScript 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部