Java实战之实现文件资料上传并生成缩略图

yizhihongxing

下面我将详细讲解“Java实战之实现文件资料上传并生成缩略图”的完整攻略。

目录

  • 资料上传的步骤
  • 生成缩略图的步骤
  • 示例一:使用Spring MVC实现文件上传
  • 示例二:使用Apache Commons FileUpload实现文件上传

资料上传的步骤

  1. 在前端页面上添加文件上传表单,并设置相应的属性。
<form action="#" method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <button type="submit">提交</button>
</form>
  1. 在服务器端接收上传的文件,可以使用Spring MVC框架或Apache Commons FileUpload组件等。

  2. 对文件进行处理(例如重命名、存储到指定目录等)。

  3. 返回上传结果给前端页面。

生成缩略图的步骤

  1. 使用Java自带的ImageIO类加载上传的图片。
File file = new File("path/to/image.jpg");
BufferedImage img = ImageIO.read(file);
  1. 调整图片尺寸。
int width = img.getWidth();
int height = img.getHeight();
int newWidth = 100; // 新的宽度
int newHeight = height * newWidth / width; // 新的高度按比例计算
Image scaledImage = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
  1. 保存缩略图至指定目录。
BufferedImage thumbnail = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = thumbnail.createGraphics();
g2d.drawImage(scaledImage, 0, 0, null);
g2d.dispose();

File thumbnailFile = new File("path/to/thumbnail.jpg");
ImageIO.write(thumbnail, "jpg", thumbnailFile);
  1. 返回缩略图文件名或URL。

示例一:使用Spring MVC实现文件上传

  1. 在pom.xml中添加依赖。
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.3.10</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.10</version>
</dependency>
  1. 添加上传文件的Controller。
@Controller
public class UploadController {
  @RequestMapping(value = "/upload", method = RequestMethod.POST)
  public String upload(@RequestParam("file") MultipartFile file, ModelMap model) throws IOException {
    String originalFilename = file.getOriginalFilename();
    String extension = FileUtils.getFileExtension(originalFilename);
    String newName = UUID.randomUUID().toString() + "." + extension;
    File newFile = new File("path/to/uploaded/" + newName);
    file.transferTo(newFile);

    BufferedImage img = ImageIO.read(newFile);
    int width = img.getWidth();
    int height = img.getHeight();
    int newWidth = 100;
    int newHeight = height * newWidth / width;
    Image scaledImage = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);

    BufferedImage thumbnail = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = thumbnail.createGraphics();
    g2d.drawImage(scaledImage, 0, 0, null);
    g2d.dispose();

    String thumbnailName = UUID.randomUUID().toString() + ".jpg";
    File thumbnailFile = new File("path/to/thumbnails/" + thumbnailName);
    ImageIO.write(thumbnail, "jpg", thumbnailFile);

    model.addAttribute("thumbnail", "/thumbnails/" + thumbnailName);
    return "result";
  }
}
  1. 添加前端页面。
<!DOCTYPE html>
<html>
<head>
  <title>文件上传示例</title>
</head>
<body>
  <h1>文件上传示例</h1>
  <form action="/upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">提交</button>
  </form>
  <hr>
  <img src="${thumbnail}" alt="缩略图">
</body>
</html>

示例二:使用Apache Commons FileUpload实现文件上传

  1. 在pom.xml中添加依赖。
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.4</version>
</dependency>
  1. 添加上传文件的Servlet。
@WebServlet(name = "FileUploadServlet", urlPatterns = {"/upload"})
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);

    try {
      List<FileItem> items = upload.parseRequest(request);
      Iterator<FileItem> iter = items.iterator();
      while (iter.hasNext()) {
        FileItem item = iter.next();
        if (!item.isFormField() && StringUtils.isNotBlank(item.getName())) {

          String originalFilename = item.getName();
          String extension = FileUtils.getFileExtension(originalFilename);
          String newName = UUID.randomUUID().toString() + "." + extension;
          File newFile = new File("path/to/uploaded/" + newName);
          item.write(newFile);

          BufferedImage img = ImageIO.read(newFile);
          int width = img.getWidth();
          int height = img.getHeight();
          int newWidth = 100;
          int newHeight = height * newWidth / width;
          Image scaledImage = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);

          BufferedImage thumbnail = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
          Graphics2D g2d = thumbnail.createGraphics();
          g2d.drawImage(scaledImage, 0, 0, null);
          g2d.dispose();

          String thumbnailName = UUID.randomUUID().toString() + ".jpg";
          File thumbnailFile = new File("path/to/thumbnails/" + thumbnailName);
          ImageIO.write(thumbnail, "jpg", thumbnailFile);

          response.setContentType("text/html;charset=UTF-8");
          response.getWriter().write("/thumbnails/" + thumbnailName);
        }
      }
    } catch (Exception ex) {
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
      response.getWriter().write(ex.getMessage());
    }
  }
}
  1. 添加前端页面。
<!DOCTYPE html>
<html>
<head>
  <title>文件上传示例</title>
</head>
<body>
  <h1>文件上传示例</h1>
  <form action="/upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">提交</button>
  </form>
  <hr>
  <img id="thumbnail" src="" alt="缩略图" style="display: none">
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.slim.min.js"></script>
  <script>
    $(function () {
      $('form').submit(function (event) {
        event.preventDefault();
        var formData = new FormData(this);
        $.ajax({
          url: '/upload',
          type: 'POST',
          data: formData,
          processData: false,
          contentType: false,
          success: function (data) {
            $('#thumbnail').attr('src', data);
            $('#thumbnail').show();
          },
          error: function (jqXHR, textStatus, errorThrown) {
            alert('上传失败:' + errorThrown);
          }
        });
      });
    });
  </script>
</body>
</html>

以上就是“Java实战之实现文件资料上传并生成缩略图”的完整攻略,希望能够对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实战之实现文件资料上传并生成缩略图 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • jsp中include指令静态导入和动态导入的区别详解

    JSP中include指令静态导入和动态导入的区别详解 在JSP中,我们可以使用include指令来包含其他的页面。include指令有两种导入方式:静态导入和动态导入。 静态导入 静态导入在JSP编译的时候就会被执行。即将被导入的页面会在编译期间被插入到包含该页面的页面中。因此,被导入的页面不能是动态生成的数据。下面是一个静态导入的示例: <%@ i…

    Java 2023年6月15日
    00
  • windows定时器配置执行java jar文件的方法详解

    一、概述 在Windows系统中,可以通过配置定时器来实现定时执行特定的任务,如在某个特定时间点自动运行指定的Java jar文件。本文将详细讲解在Windows系统中配置定时器来执行Java jar文件的具体方法和步骤,同时提供两个示例以便读者更好地理解实现过程。 二、配置方法 创建批处理文件 首先需要创建一个批处理文件,用于启动Java jar程序。在文…

    Java 2023年6月1日
    00
  • Java中Lambda表达式基础及使用

    Java中Lambda表达式基础及使用攻略 什么是Lambda表达式? Lambda表达式是一个新的功能,它是Java 8版本新推出的,用于代替Java的传统匿名类,使代码更加简洁和易于阅读。Lambda表达式是一种匿名函数,可以传递给一个方法或存储在一个变量中,使用时就像调用一个方法一样。 Lambda表达式的语法 Lambda表达式是由参数列表、箭头符号…

    Java 2023年5月26日
    00
  • 如何在JDK 9中更简洁使用 try-with-resources 语句

    在 JDK 9 中,你可以更加简洁地使用 try-with-resources 语句。下面,我们来一步步讲解具体的步骤。 1. JDK 9 try-with-resources 简化语法 在 JDK 9 中,简化了 try-with-resources 语法。以前,你需要在 try 语句中申明一个资源,像这样: try (SomeResource resou…

    Java 2023年5月27日
    00
  • 教你一步到位部署运行MyBatis3源码(保姆级)

    教你一步到位部署运行MyBatis3源码(保姆级) 前言 MyBatis 是一个开源的免费的 Java 持久层框架,它利用简单的 XML 或注解代码来配置和映射数据库操作。 在实际的开发中,我们经常会直接使用 MyBatis 这个框架来进行数据库的操作,但有时候会需要修改或者扩展 MyBatis3 的源码来满足自己的需求,那么这时候就需要我们先将 MyBat…

    Java 2023年5月20日
    00
  • 浅析Java中对象的创建与对象的数据类型转换

    这里是“浅析Java中对象的创建与对象的数据类型转换”的攻略。 1. 对象的创建 Java中的对象可以由new关键字创建,一个对象的创建需要以下步骤: 分配对象的内存空间:在堆内存中为新对象分配一片连续的空间,这个空间的大小由对象的数据类型和属性决定。 执行构造函数:在分配好内存空间之后,JVM会执行对象的构造函数,初始化对象的属性值等。 将对象的引用返回给…

    Java 2023年5月26日
    00
  • Java实现多线程聊天室

    实现多线程聊天室,在Java中可以通过使用Socket和Thread来实现。 具体步骤如下: 1.创建服务器端- 创建ServerSocket对象,并设置端口号- 创建Socket对象,以接受客户端请求- 使用Thread创建一个线程,以接受客户端发来的消息,并将消息广播给其他客户端- 使用ArrayList存储客户端(每个客户端都对应一个Socket对象)…

    Java 2023年5月18日
    00
  • Struts2之Action接收请求参数和拦截器详解

    Struts2之Action接收请求参数和拦截器详解 本文主要介绍了如何在Struts2中使用Action来接收请求参数,并通过拦截器对Action进行增强。 Action接收请求参数 在Struts2中,我们可以通过Action来获取请求中的参数。 获取参数的方式 直接在Action的成员变量中声明参数,并提供setter方法,Struts2会自动为我们注…

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