Java文件上传(最详细的单文件上传,多文件上传和异步上传)

文件上传

  1. 前端表单:

    • 用户通过一个包含<input type="file">的HTML表单选择要上传的文件。
    • 表单通常使用<form>标签定义,并设置enctype="multipart/form-data"属性,这对于上传文件是必需的,因为它允许表单数据被编码为多部分表单数据。
  2. HTTP请求:

    • 用户提交表单后,浏览器会创建一个HTTP POST请求,将文件作为请求的一部分发送。
    • 文件数据被编码为multipart/form-data格式,这允许在单个请求中发送文件和表单数据。

 

一.单文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>单个文件上传</title>
</head>
<body>
<h3>文件上传</h3>
<form action="/upload/uploadFile" method="post" enctype="multipart/form-data">
    <!--文件上传控件类型为file,要有name属性-->
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>
</body>
</html>
@RequestMapping("/uploadFile")
    public String fileUpload(MultipartFile file) throws IOException {
        // 定义文件存储的根路径
        String realPath = "D:\\web\\springCloud\\lhqDemo\\src\\upload";
        // 创建File对象,指向根路径
        File uploadDir = new File(realPath);
        // 检查目录是否存在,如果不存在则创建
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        // 获取上传的文件名称
        String fileName = file.getOriginalFilename();
        // 生成新的文件名,使用UUID确保唯一性
        fileName = UUID.randomUUID().toString() + "_" + fileName;
        // 创建新的File对象,包含文件的完整路径
        File newFile = new File(uploadDir, fileName);
        // 将上传的文件数据写入到服务器的文件中
        file.transferTo(newFile);
        return "index";
    }

1. 前端页面中的name名称需要与控制器参数MultipartFile对象名称一致,也可以用@RequestParam注解来进行协调 。

2.前端页面中的form表单需要指定提交类型为文件类型enctype="multipart/form-data"。


 

二.多文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多文件上传</title>
</head>
<body>
<h1>多文件上传</h1>
<form action="/upload/uploadFile1" method="post" enctype="multipart/form-data">
    用户名:<input name="username"><br>
    文件一:<input type="file" name="file"><br>
    文件二:<input type="file" name="file"><br>
    <input type="submit" value="上传" >
</form>
</body>
</html>
//多文件上传
    @RequestMapping("/uploadFile1")
    @ResponseBody
    public String fileUpload1(MultipartFile file[],String username) throws IOException {
        String realPath = "D:\\web\\springCloud\\lhqDemo\\src\\upload1";
        File uploadDir = new File(realPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        //上面一样,需要遍历进行文件上传
        for (MultipartFile multipartFile : file) {
            String fileName = multipartFile.getOriginalFilename();
            fileName = UUID.randomUUID().toString() + "_" + fileName;
            File newFile = new File(uploadDir, fileName);
            multipartFile.transferTo(newFile);
        }
        return username;
    }

1.多文件上传的前端页面中要注意两个文件的name属性名称需要一样。

2.控制器层的代码基本与上面的一致,只不过这里需要一个一个for循环遍历文件对象,循环的内容都一样。 


 

 三.异步上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异步上传</title>
    <script src="/js/jquery-2.1.1.min.js"></script>
    <script src="/js/jquery.form.js"></script>
</head>
<body>
<form enctype="multipart/form-data" id="ajaxForm">
    文件一:<input type="file" name="file"><br>
<!--    进行异步的表单提交,不会跳转页面而是刷新该页面 -->
<!--    按钮不能是submit代表同步提交的意思,否则会刷新页面-->
    <input type="button" value="上传头像" id="btn" >
</form>
<!--上传头像后显示的位置-->
<img src="/" width="100" id="img">
<script>
    $(document).ready(function () {
        $('#btn').click(function (){
            //异步提交表单
            $('#ajaxForm').ajaxSubmit({
                url:'/upload/asynchronousUpload',
                type:'post',
                success:function (data){
                    alert(data)
                    $("#img").attr('src',data);
                }
            })

        })
    })
</script>
</body>
</html>
//异步文件上传
    @RequestMapping("/asynchronousUpload")
    @ResponseBody
    public String asynchronous(MultipartFile file, HttpServletRequest request) throws IOException {
        //需要在服务器内部创建一个保存文件的文件夹
        String realpath =request.getServletContext().getRealPath("/uploadAsync");
        System.out.println(realpath);
        File uploadDir = new File(realpath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        String fileName = file.getOriginalFilename();
        fileName = UUID.randomUUID().toString() + "_" + fileName;
        File newFile = new File(uploadDir, fileName);
        file.transferTo(newFile);
        //返回文件路径
        //在文件夹里是看不到图片的,在服务器里面
        //文件访问:返回的路径是相对于Web应用程序根目录的,这意味着你可以通过这个路径直接在浏览器中访问上传的文件。
        return "/uploadAsync/"+fileName;
    }

1.异步上传:异步上传是一种在计算机编程中常用的技术,特别是在处理文件上传时。它允许用户在上传文件的同时继续进行其他操作,而不是等待文件上传完成。 

2.需要用到这两个js文件,大家自行去下载合适的版本即可 

 65fe09f684364754874d918b9be1240a.png

 执行流程:

  1. 页面加载完成后,等待用户点击ID为btn的按钮。
  2. 用户点击按钮后,触发事件,执行绑定的函数。
  3. 函数执行,使用ajaxSubmit方法异步提交ID为ajaxForm的表单。
  4. 表单数据被发送到/upload/asynchronousUpload
  5. 服务器处理请求并返回响应数据。
  6. 如果请求成功,执行success回调函数,弹出包含响应数据的警告框,并更新页面上的图片元素的src属性为服务器返回的图片URL。

详细解释:

  1. $(document).ready(function () {...}):这是一个jQuery函数,它确保在文档完全加载和解析完成后再执行内部的函数。这意味着所有的DOM元素都已经就绪,可以被安全地访问和操作。

  2. $('#btn').click(function (){...}):这行代码为ID为btn的元素(通常是按钮)绑定了一个点击事件。当用户点击这个按钮时,会执行花括号内的函数。

  3. $('#ajaxForm').ajaxSubmit({...}):这是jQuery插件ajaxSubmit的调用,它允许你以异步方式提交表单。ajaxSubmitjquery.form.js插件提供的一个方法,它封装了原生的XMLHttpRequest对象,使得异步提交表单更加简单。

  4. url:'/upload/asynchronousUpload':这是异步请求的目标URL,表单数据将被发送到这个地址。

  5. type:'post':这指定了HTTP请求的类型,这里是POST方法,意味着数据将被包含在请求体中发送。

  6. success:function (data){...}:这是一个回调函数,当异步请求成功完成时执行。这里的data参数包含了服务器响应的数据。

  7. alert(data):在请求成功后,弹出一个包含服务器响应数据的警告框。这通常用于调试,以查看服务器返回的数据。

  8. $("#img").attr('src',data);:这行代码将页面上ID为img的元素(通常是<img>标签)的src属性设置为服务器返回的数据。这意味着如果服务器返回了一个图片的URL,那么这个URL将被用来更新图片的源地址,从而在页面上显示新图片。

 


 

四,完整代码与目录结构以及运行截图 

package com.cloud.lhqdemo.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@SuppressWarnings("all")
@RequestMapping("/upload")
public class UploadController {
    //单文件上传
    @RequestMapping("/uploadFile")
    public String fileUpload( MultipartFile file) throws IOException {
        // 定义文件存储的根路径
        String realPath = "D:\\web\\springCloud\\lhqDemo\\src\\upload";
        // 创建File对象,指向根路径
        File uploadDir = new File(realPath);
        // 检查目录是否存在,如果不存在则创建
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        // 获取上传的文件名称
        String fileName = file.getOriginalFilename();
        // 生成新的文件名,使用UUID确保唯一性
        fileName = UUID.randomUUID().toString() + "_" + fileName;
        // 创建新的File对象,包含文件的完整路径
        File newFile = new File(uploadDir, fileName);
        // 将上传的文件数据写入到服务器的文件中
        file.transferTo(newFile);
        // 返回重定向指令,通常用于防止表单重复提交
        return "index";
    }
    //多文件上传
    @RequestMapping("/uploadFile1")
    @ResponseBody
    public String fileUpload1(MultipartFile file[],String username) throws IOException {
        String realPath = "D:\\web\\springCloud\\lhqDemo\\src\\upload1";
        File uploadDir = new File(realPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        //上面一样,需要遍历进行文件上传
        for (MultipartFile multipartFile : file) {
            String fileName = multipartFile.getOriginalFilename();
            fileName = UUID.randomUUID().toString() + "_" + fileName;
            File newFile = new File(uploadDir, fileName);
            multipartFile.transferTo(newFile);
        }
        return username;
    }
    //异步文件上传
    @RequestMapping("/asynchronousUpload")
    @ResponseBody
    public String asynchronous(MultipartFile file, HttpServletRequest request) throws IOException {
        //需要在服务器内部创建一个保存文件的文件夹
        String realpath =request.getServletContext().getRealPath("/uploadAsync");
        System.out.println(realpath);
        File uploadDir = new File(realpath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        String fileName = file.getOriginalFilename();
        fileName = UUID.randomUUID().toString() + "_" + fileName;
        File newFile = new File(uploadDir, fileName);
        file.transferTo(newFile);
        //返回文件路径
        //在文件夹里是看不到图片的,在服务器里面
        //文件访问:返回的路径是相对于Web应用程序根目录的,这意味着你可以通过这个路径直接在浏览器中访问上传的文件。
        return "/uploadAsync/"+fileName;
    }
}

4548bfbc71524335ba4ade341f0c00dd.png

 1.单文件上传f44b2cead17e4f45b66210d15993bedd.png

6eb338d4db6d4d8a9ec1144548ecbfdf.png2.多文件上传 

717d17657cb142808e47839984f98600.png

851a56b92c794811adcf8bb3f5ba9660.png  3.异步上传

2bd0f1263630400cb8d4bd1528dbabd4.png

e43622bbe2f34909b7afed96f1d29379.png

 


 最后,宝子们有什么不懂的或者更好的可以评论出来或者私信我,咱们一起进步哦!感谢大家的支持,留下一个关注吧。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无缘过去@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值