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

yizhihongxing

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日

相关文章

  • 让IIS6支持JSP的设置方法(IIS完美整合Tomcat)

    让IIS6支持JSP的设置方法主要是通过IIS和Tomcat的联合来实现,在整合过程中,需要对IIS的默认配置进行一些修改与设置,以便让IIS能够支持JSP页面的访问。 以下是详细的设置步骤: 1. 安装Tomcat 首先需要安装支持JSP和Servlet的Tomcat服务器,可以去官网下载Tomcat,下载完成后进行安装,安装时需要指定Tomcat的安装路…

    Java 2023年5月19日
    00
  • struts2 session 解读

    下面是“struts2 session 解读”的完整攻略: 什么是Session Session是HTTP协议中的一种机制,用来存储客户端与服务端之间的状态信息。在Struts2框架中,Session就是为了在不同的Action中传递数据而存在的一个对象,它的作用就相当于是一个数据仓库,用来存储当前用户的状态信息。 Session的使用 在Struts2框架…

    Java 2023年5月20日
    00
  • Spring获取ApplicationContext对象工具类的实现方法

    获取ApplicationContext对象是在使用Spring框架时非常常见的操作,可以方便地获取容器中的各种Bean实例。在Spring中,有多种方法可以获取ApplicationContext对象,下面给出了两种常用的方式: 方式一:通过注解@Autowried来获取ApplicationContext对象 import org.springframe…

    Java 2023年6月15日
    00
  • Java中的Valid和Validated的比较内容

    当我们进行Java Bean校验时,通常会使用Hibernate提供的校验框架。Valid和Validated是该框架中最常用的两种表单验证注解,它们都是用于指定校验组,在校验时都可以用来限制哪些校验组中的校验规则生效。但是,它们有一些区别。下面我将详细讲解Java中Valid和Validated的比较内容,帮助读者理解它们的使用方法。 Valid注解 @V…

    Java 2023年5月20日
    00
  • asp.net getRemoteAddr()与 getRemoteHost()的区别

    为了更好地理解getRemoteAddr()和getRemoteHost()这两个方法的区别,我们需要先了解一下HTTP协议和网络协议。HTTP协议是一种基于网络协议的高级应用层协议,它定义了浏览器和Web服务器之间传输数据的格式和方式。网络协议则是计算机之间通信的规则和标准,它涵盖了物理层、数据链路层、网络层等各种层次。在浏览器和Web服务器之间传输数据时…

    Java 2023年6月15日
    00
  • 简单了解java类的初始化以及类的实例化

    简单了解Java类的初始化以及类的实例化 Java类的初始化 在Java中,类的初始化是指在类的第一次被使用时,JVM对其进行的一系列步骤。当JVM加载一个类时,它首先会进行初始化,这个过程包括以下几部分: 分配静态变量存储空间并初始化静态变量,如果静态变量有初始值,那么直接使用该值进行初始化;否则使用默认值进行初始化,例如整型会被初始化为0,布尔型会被初始…

    Java 2023年5月26日
    00
  • 基于Java在netty中实现线程和CPU绑定

    基于Java在netty中实现线程和CPU绑定,可以提高系统的稳定性和性能。以下是具体的实现攻略。 一、绑定CPU 绑定CPU可以有效避免Java进程因为线程数量过多和线程切换而导致CPU资源繁忙,从而降低系统的性能。在Java中绑定CPU可以通过任务调度类java.util.concurrent.ScheduledThreadPoolExecutor中的s…

    Java 2023年5月19日
    00
  • Storm框架整合springboot的方法

    下面是详细的Storm框架整合Spring Boot的方法: 1. 在Spring Boot项目中添加Storm依赖 首先需要在Spring Boot项目的pom.xml中添加Storm的依赖。在<dependencies>标签内添加以下内容: <dependency> <groupId>org.apache.storm&…

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