java web图片上传和文件上传实例详解

Java Web 图片上传和文件上传实例详解

在 Java Web 开发中,图片上传和文件上传是一个非常常见的操作。本文将会介绍如何在 Java Web 中实现图片上传和文件上传,以及如何在前端进行用户体验的优化。

上传文件的基本步骤

上传文件的基本步骤如下:

  1. 创建一个表单,用于选择文件。表单的 method 必须为 POST, enctype 必须为 multipart/form-data。
  2. 在后台使用 MultipartRequest 的方式进行文件上传。
  3. 在后台将上传的文件流输出到指定的位置,一般是服务器上的磁盘路径。
  4. 在后台处理完毕后,返回一个上传成功的页面。

实现图片上传

使用 JSP 实现图片上传

下面是一个使用 JSP 实现图片上传的例子。在这个例子中,我们将会使用 Apache 的 FileUpload 组件来完成上传操作。

首先,我们需要通过 Maven 或是手动下载来获得 FileUpload 组件:

<!-- pom.xml -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.2</version>
</dependency>

接着,我们就可以使用 FileUpload 组件了。下面是一个在 JSP 中实现图片上传的例子:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="java.io.*" %>

<html>
  <head>
    <title>文件上传示例</title>
  </head>
  <body>
    <form method="post" action="upload.jsp" enctype="multipart/form-data">
      <input type="file" name="file" />
      <br />
      <input type="submit" value="提交" />
    </form>

    <%!
      private static final String UPLOAD_DIRECTORY = "uploads";

      private void upload(HttpServletRequest request) throws ServletException, IOException {
        // 检查上传的文件是否存在
        if (!ServletFileUpload.isMultipartContent(request)) {
          throw new ServletException("上传的文件不存在");
        }

        // 创建一个 FileItemFactory 实例
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 设置缓存区大小
        factory.setSizeThreshold(1024 * 1024);

        // 创建一个 ServletFileUpload 实例
        ServletFileUpload upload = new ServletFileUpload(factory);

        // 设置上传文件的最大大小限制
        upload.setFileSizeMax(1024 * 1024 * 10);

        // 设置上传文件的总大小限制
        upload.setSizeMax(1024 * 1024 * 50);

        // 处理上传的文件
        List<FileItem> items = upload.parseRequest(request);

        for (FileItem item : items) {
          if (!item.isFormField()) {
            String fileName = new File(item.getName()).getName();
            String filePath = UPLOAD_DIRECTORY + File.separator + fileName;
            File storeFile = new File(filePath);

            // 保存文件到硬盘
            item.write(storeFile);
          }
        }
      }
    %>

    <%!

      public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
        doPost(request, response);
      }

      public void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
        // 将请求的 ContentType 设为 multipart/form-data
        response.setContentType("text/html;charset=utf-8");

        // 处理文件上传
        upload(request);

        // 返回上传成功的提示信息
        PrintWriter out = response.getWriter();
        out.print("<html><body>");
        out.print("<h3>文件上传成功</h3>");
        out.print("</body></html>");
      }

    %>
  </body>
</html>

在这个例子中,我们使用 FileUpload 组件在后台对上传的文件进行了处理,并将上传的文件保存到了指定的文件夹中。

使用 SpringMVC 实现图片上传

下面是一个使用 SpringMVC 实现图片上传的例子。同样的,我们还是使用 Apache 的 FileUpload 组件来完成文件上传操作。

首先,我们需要通过 Maven 或是手动下载来获得 FileUpload 组件:

<!-- pom.xml -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.2</version>
</dependency>

接着,我们需要在 SpringMVC 中配置 MultipartResolver Bean 来完成文件上传的操作。下面是一个示例:

<!-- applicationContext.xml -->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!-- 设置文件上传的最大限制 -->
  <property name="maxUploadSize" value="10485760" />
</bean>

我们还需要在 Controller 中实现文件上传操作。下面是一个示例:

@Controller
@RequestMapping("/file")
public class FileUploadController {

  @RequestMapping(value = "/upload", method = RequestMethod.POST)
  public String upload(@RequestParam MultipartFile file, ModelMap modelMap) {
    if (!file.isEmpty()) {
      try {
        byte[] bytes = file.getBytes();

        //设置图片保存位置
        String imagePath = "/tmp/";
        String fileName = file.getOriginalFilename();
        File fileToSave = new File(imagePath + fileName);

        // 写入磁盘
        BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileToSave));
        stream.write(bytes);
        stream.close();

        modelMap.addAttribute("fileName", fileName);

        return "fileUploadResult";
      } catch (Exception e) {
        return "fileUploadError";
      }
    } else {
      return "fileUploadError";
    }
  }

  @RequestMapping(value = "/showUploadForm")
  public String showUploadForm() {
    return "fileUploadForm";
  }
}

在这个例子中,我们在 Controller 中使用了 SpringMVC 提供的 MultipartFile 对象来操作上传的文件。

文件上传优化

上传文件的过程并不是非常快,如果用户要上传较大的文件,可能需要等待很长时间,给用户带来了不好的用户体验。这个时候可以使用以下技术来进行文件上传的优化。

使用 Ajax 完成文件上传

使用 Ajax 完成文件上传,可以有效地减小用户的等待时间,从而提升用户体验。在使用 Ajax 完成文件上传时,我们需要使用 jQuery 和 jQuery Form 插件。

接下来,我们就可以在前端使用以下方式来完成文件上传:

<!-- index.html -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Ajax 文件上传实例</title>
    <script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery.form/4.2.2/jquery.form.min.js"></script>
  </head>
  <body>
    <h1>文件上传示例</h1>

    <form method="post" action="upload" enctype="multipart/form-data" id="myForm">
      <input type="file" name="file" />
      <br />
      <br />

      <button type="submit">上传文件</button>
    </form>

    <script>
      $(document).ready(function() {
        $('#myForm').submit(function() {
          $(this).ajaxSubmit({
            beforeSubmit: function() {
                // 添加 loading 效果
                $('#loading').show();
            },
            success: function(responseText, statusText, xhr, $form) {
                // 关闭 loading 效果
                $('#loading').hide();
                alert('文件上传成功');
            }
          });
          return false;
        });
      });
    </script>
  </body>
</html>

在这个例子中,我们首先在前端使用了基本的表单来进行文件上传,然后通过 jQuery Form 插件来对表单进行 AJAX 化。

使用 AngularJS 完成文件上传

AngularJS 是一种前端框架,可以有效地简化前端开发的复杂性。在文件上传方面,AngularJS 提供了 ng-file-upload 插件来帮助我们完成文件上传操作。

首先,我们需要在前端通过 Bower 或是手动下载来获取 ng-file-upload 插件:

bower install ng-file-upload

然后,在前端里使用以下方式来完成文件上传:

<!-- index.html -->

<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <title>文件上传示例</title>
    <meta charset="utf-8">
    <script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-file-upload/2.5.0/angular-file-upload.js"></script>
    <style type="text/css">
        #loading {
            display: none;
            font-size: 18px;
        }
    </style>
</head>

<body>
<div ng-controller="UploadCtrl">
    <h1>文件上传示例</h1>

    <form>
        <input type="file" ngf-select ng-model="file" name="file" />
        <br />
        <br />

        <button type="submit" ng-click="submit()">上传文件</button>
    </form>

    <div id="loading">正在上传文件,请稍等...</div>
</div>

<script>
    var myApp = angular.module('myApp', ['ngFileUpload']);

    myApp.controller('UploadCtrl', ['$scope', 'Upload', function ($scope, Upload) {
        $scope.submit = function () {

            // 较慢的文件上传速度会屏蔽 loading 窗口和赋值转旋转的效果,所以要在这里保持成可见的形式
            $('#loading').show();

            // 开始文件上传
            Upload.upload({
                url: '/upload',
                data: {file: $scope.file}
            }).then(function (resp) {
                // 上传成功
                $('#loading').hide();

                alert("上传成功!");
            }, function (resp) {
                // 上传失败
                $('#loading').hide();

                console.log(resp);
                alert("上传失败!");
            }, function (evt) {
                // 文件上传进度
                var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
                console.log('上传进度: ' + progressPercentage + '% ' + evt.config.data.file.name);
            });
        };
    }]);
</script>
</body>
</html>

在这个例子中,我们在前端使用了上传插件 ng-file-upload,在后台使用 SpringMVC 进行了处理。

总结

本文介绍了如何在 Java Web 中实现图片上传和文件上传,还介绍了文件上传的优化技术。文件上传是 Web 开发中一个非常常见的操作,我们需要使用最好的方式来完成文件上传操作,从而提升用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java web图片上传和文件上传实例详解 - Python技术站

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

相关文章

  • java中排序报:Comparison method violates its general contract异常的解决

    首先,我们需要了解一下“Comparison method violates its general contract”异常的意义。这个异常意味着我们在使用Java排序方法时,按照给定的比较器进行比较时违反了排序的基本规则,可能会导致排序结果出现异常,或者在使用Collections.sort()等排序方法时,发生无限递归的错误。 因此,当我们遇到这种异常时…

    Java 2023年5月27日
    00
  • Spring IOC创建对象的两种方式

    创建对象是应用程序开发中最常见的操作之一。在Spring框架中,我们通常使用Spring IOC(控制反转)来管理对象的创建和整个应用程序的生命周期。Spring IOC的主要作用是根据应用程序中的配置,自动创建和维护应用程序中的对象。 Spring IOC创建对象的两种方式: 构造函数注入 Setter方法注入 下面将逐一介绍这两种方式。 1. 构造函数注…

    Java 2023年5月26日
    00
  • hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    下面是我对“hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法”的完整攻略。 1. 什么是 fetch=FetchType.LAZY 懒加载? 在 Hibernate 中,fetch 是控制语句 load 与 get 的机制的一个选项。fetch = FetchType.LAZY 就是懒加载模式。它是指当我们使用 Hiber…

    Java 2023年5月20日
    00
  • MyBatis入门程序

    下面我就来详细讲解一下MyBatis入门程序的完整攻略。 1. 环境搭建 首先,我们需要在本地搭建好MyBatis的开发环境。具体步骤如下: 下载MyBatis的最新版本。 创建一个Maven项目,将下载好的MyBatis加入到项目的依赖中。 在项目中创建一个名为“mybatis-config.xml”的文件,用来配置MyBatis的核心设置,例如数据库连接…

    Java 2023年5月20日
    00
  • java和js实现的洗牌小程序

    洗牌算法简介 洗牌算法即可将一个包含n个元素的数组打乱,保证每个元素均匀地分布在原数组中。常用的洗牌算法有Fisher–Yates算法(也被称为Knuth-Shuffle算法),其核心思想是将数组从后往前遍历,对于未处理的元素,随机从已处理的元素中选出一个,然后与该元素交换。这样可以保证每个元素被随机地赋予新的位置。 Java实现 Java官方提供了Coll…

    Java 2023年5月23日
    00
  • SpringBoot使用编程方式配置DataSource的方法

    当使用SpringBoot构建Web应用程序时,我们常常需要使用数据源,这里我们具体讲解使用编程方式配置DataSource的方法。 首先,需要在pom.xml文件中添加相应的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactI…

    Java 2023年5月19日
    00
  • spring data JPA 中的多属性排序方式

    标题:spring data JPA 中的多属性排序方式 简介 Spring Data JPA是Spring框架中访问JPA数据的一个模块。它提供一种方便的方式来持久化数据,同时也提供了许多有用的特性,其中之一就是排序。常见的排序方式包括按照单个属性排序,但在某些情况下我们需要按照多个属性来排序。在本篇文章中,我将介绍如何使用Spring Data JPA中…

    Java 2023年5月20日
    00
  • java实现图书管理系统

    Java实现图书管理系统示例 1. 开发环境准备 在开始开发之前,需要准备以下开发工具和环境: Java SE Development Kit(JDK)——Java开发工具包,用于编写和运行Java程序。 Eclipse IDE——一款Java开发集成工具,可以在其中编写Java代码。 MySQL数据库——用于存储图书和用户信息。 Navicat for M…

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