SpringBoot-实现异步文件上传

一、异步实现文件上传?

1.准单独解压一个Tomcat作为文件服务器

**加粗样式**
在这里插入图片描述
2、设置远程服务器端口号:
在conf下的server.xml
在这里插入图片描述
3、远程服务器中设置非只读
在这里插入图片描述
4、webapps下创建一个upload目录
在这里插入图片描述
5、启动Tomocat测试
在这里插入图片描述

1.项目构建

1、项目结构图
在这里插入图片描述
2、导入相关依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.19</version>
        </dependency>
    </dependencies>

3、regist.html前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .progress {
            width: 200px;
            height: 10px;
            border: 1px solid #ccc;
            border-radius: 10px;
            margin: 10px 0px;
            overflow: hidden;
        }
        /* 初始状态设置进度条宽度为0px */
        .progress > div {
            width: 0px;
            height: 100%;
            background-color: yellowgreen;
            transition: all .3s ease;
        }
    </style>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#uploadFile").click(function(){
                // 获取要上传的文件
                var photoFile =$("#photo")[0].files[0]
                if(photoFile==undefined){
                    alert("您还未选中文件")
                    return;
                }
                // 将文件装入FormData对象
                var formData =new FormData();
                formData.append("headPhoto",photoFile)
                // ajax向后台发送文件
                $.ajax({
                    type:"post",
                    data:formData,
                    url:"file/upload",
                    processData:false,
                    contentType:false,
                    success:function(result){
                        // 接收后台响应的信息
                        alert(result.message)
                        // 图片回显
                        $("#headImg").attr("src",result.newFileName);
                    },
                    xhr: function() {
                        var xhr = new XMLHttpRequest();
                        //使用XMLHttpRequest.upload监听上传过程,注册progress事件,打印回调函数中的event事件
                        xhr.upload.addEventListener('progress', function (e) {
                            //loaded代表上传了多少
                            //total代表总数为多少
                            var progressRate = (e.loaded / e.total) * 100 + '%';
                            //通过设置进度条的宽度达到效果
                            $('.progress > div').css('width', progressRate);
                        })
                        return xhr;
                    }
                })
            })
        })
    </script>
</head>
<body>
<form action="addPlayer" method="get">
    <p>账号<input type="text" name="name"></p>
    <p>密码<input type="text" name="password"></p>
    <p>昵称<input type="text" name="nickname"></p>
    <p>头像:
        <br/>
        <input id="photo" type="file">
        <br/>
        <img id="headImg" style="width: 200px;height: 200px" alt="你还未上传图片">
        <br/>
    <div class="progress">
        <div></div>
    </div>
    <a id="uploadFile" href="javascript:void(0)">立即上传</a>
    </p>
    <p><input type="submit" value="注册"></p>
</form>
</body>
</html>

4、导入js文件
链接https://pan.baidu.com/s/1Jo381D_kuWHvlrazHKYvtA
提取码:2959

5、编写后端代码

package com.jowell.controller;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @Description: TODO
 * @Author: JoWell
 * @Date: 2021/6/10 9:39
 * @Version: v1.0
 */
@Controller
@RequestMapping("/file")
public class FileController {
    //文件存储位置
    private final static String FILEUPLOAD = "http://127.0.0.1:8090/upload/";

    @RequestMapping("/upload")
    @ResponseBody
    public Map<String, String> upload(MultipartFile headPhoto, HttpServletRequest request) throws IOException {
        Map<String, String> map = new HashMap<>();
        
        // 获取文件名
        String originalFilename = headPhoto.getOriginalFilename();
        
        // 避免文件名冲突,使用UUID替换文件名
        String uuid = UUID.randomUUID().toString();
        
        // 获取拓展名
        String extendsName = originalFilename.substring(originalFilename.lastIndexOf("."));
        
        // 新的文件名
        String newFileName = uuid.concat(extendsName);
        
        // 创建 sun公司提供的jersey包中的client对象
        Client client = Client.create();
        WebResource resource = client.resource(FILEUPLOAD + newFileName);
        
        //  文件保存到另一个服务器上去了
        resource.put(String.class, headPhoto.getBytes());
        
        // 上传成功之后,把文件的名字和文件的类型返回给浏览器
        map.put("message", "上传成功");
        map.put("newFileName", FILEUPLOAD+newFileName);
        map.put("filetype", headPhoto.getContentType());
        return map;
    }
}

6、启动SpringBoot
在这里插入图片描述
7、页面效果图
在这里插入图片描述
8、点击:选择上传文件以及图片,然后点击上传
如下图:已经上传成功
在这里插入图片描述
9、查看文件保存的位置,就是我们配置的Tomocat下的webapp下的upload
就是这么简单:哈哈哈
在这里插入图片描述

Spring Boot提供了名为MultipartFile的接口来支持异步表单上传文件。要在Spring Boot实现异步表单上传文件,可以按照以下步骤进行操作: 1. 在Spring Boot应用程序的依赖项中引入相应的MultipartFile依赖项。如使用Maven,可以在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 在控制器类中创建一个方法,用于处理上传文件的请求。可以使用`@PostMapping`注解将该方法映射到相应的URL请求。例如: ```java @PostMapping("/upload") public CompletableFuture<String> uploadFile(@RequestParam("file") MultipartFile file) { // 处理文件上传逻辑 // 返回上传结果 } ``` 3. 在上传文件的方法中,可以使用异步处理来实现异步文件上传。可以使用`CompletableFuture`类来处理异步任务。例如: ```java @PostMapping("/upload") public CompletableFuture<String> uploadFile(@RequestParam("file") MultipartFile file) { return CompletableFuture.supplyAsync(() -> { // 处理文件上传逻辑 // 返回上传结果 }); } ``` 4. 在处理文件上传的逻辑中,可以使用`MultipartFile`接口提供的方法来访问和处理上传的文件。例如: ```java @PostMapping("/upload") public CompletableFuture<String> uploadFile(@RequestParam("file") MultipartFile file) { return CompletableFuture.supplyAsync(() -> { // 获取上传文件的原始文件名 String fileName = file.getOriginalFilename(); // 获取上传文件的字节数组 byte[] fileBytes = file.getBytes(); // 进行上传文件的业务逻辑处理 // 返回上传结果 }); } ``` 通过上述步骤,就可以在Spring Boot应用程序中实现异步表单上传文件的功能。在处理上传文件的方法中,可以根据具体需求对上传的文件进行处理,并返回上传结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喝汽水的猫^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值