0
点赞
收藏
分享

微信扫一扫

python连接clickhouse (CK)

前言

文件上传和下载是 Web 开发中的重要环节,但它们往往不那么容易实现。幸运的是,Spring MVC 提供了一套简单而又强大的解决方案,让我们可以专注于业务逻辑,而不必过多关注底层的文件处理细节。

在本篇博客中,我们将学习如何利用 Spring MVC 实现文件上传和下载功能。首先,我们将了解文件上传的过程以及必要的配置。随后,我们将介绍如何在控制器中处理上传的文件,并对其进行存储或处理。最后,我们将学习如何实现文件下载的功能,使用户能够方便地获取指定的文件。

 一、前期准备

1、新建项目,结构如下

2、导入依赖
    <dependencies>
    
        <!-- springmvc 依赖,会将spring的核心包一并添加进来 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</version>
        </dependency>
     
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>
 
        <!-- 上传组件 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
 
 
 
    </dependencies>
 3、配置 web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

用于配置 Servlet 的映射和加载。在 Spring MVC 中,它用于配置 DispatcherServlet 的初始化和请求映射。

具体来说,这段配置的作用如下:

 这段配置的作用是将所有的请求交给 DispatcherServlet 处理,并让它成为应用的核心控制器。DispatcherServlet 将根据请求的 URL 和其他配置信息,将请求分发给相应的处理器方法进行处理,然后返回响应结果。


4、编写 ResultVO 类
@Data
public class ResultVO<T> {

    private Integer code = HttpStatus.OK.value();
    private String message;
    private T data;

}
5、编写 ProductVO 类
/**
 * @Date 2023-10-24
 * @Author qiu
 * 商品 VO 对象,用于保存页面提交的数据
 * 后续将这个 vo 拷贝到 entity 中
 */
@Data
public class ProductVO {

    /**
     * 商品名称
     */
    private String productName;

    /**
     * 商品图片
     */
    private MultipartFile[] file;

}

二、 实现文件上传

1、文件上传

@RestController
@Slf4j
public class ProductContoroler {

    /**
     * 添加商品,同时带有上传的附件
     * @param productVO
     * @return
     */
    @PostMapping("/add")
    public ResultVO add(ProductVO productVO) throws IOException {
        ResultVO resultVO = new ResultVO();
        // 获取上传的路径(绝对路径)
        String uploadPath = "d://file/";

        // 拼接完整的上传路径
//        uploadPath += filename;

        log.info(uploadPath);
        // 根据路径构建一个上传的文件对象
        File uploadFile = new File(uploadPath);
        // 判断路径中的文件夹是否存在,不存在则创建
        if (!uploadFile.exists()) {
            // 将文件夹创建出来
            uploadFile.mkdirs();
        }
        // 获取上传的文件名
        MultipartFile[] file = productVO.getFile();
        for (MultipartFile multipartFile : file) {
            // 获取文件名
            String filename = multipartFile.getOriginalFilename();

            // 执行上传
            Path path = FileSystems.getDefault().getPath(uploadFile.getAbsolutePath(),filename);

            multipartFile.transferTo(path);
        }
        return resultVO;
    }

}
2、编写 xml 完成配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 扫描 -->
    <context:component-scan base-package="edu.nf.ch08"/>
    <!-- mvc注解驱动-->
    <mvc:annotation-driven/>
    <!-- 静态资源处理器-->
    <mvc:default-servlet-handler/>
    <!-- 装配上传附件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 限制文件上传的总大小(单位:字节),不配置此属性默认不限制 -->
        <property name="maxUploadSize" value="104857600"/>
        <!-- 设置文件上传的默认编码-->
        <property name="defaultEncoding" value="utf-8"/>
    </bean>

 

</beans>
3、编写页面实现上传
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/JQuery文件.txt.js"></script>
</head>
<body>


<form id="f1" enctype="multipart/form-data">

    Name:<input type="text" name="productName"/><br>
    Image:<input type="file" name="file" multiple/><br>
    <input type="button" value="提交"/><br>

</form>

<script>
    $(function () {
        $(':button').on('click',function () {
            // 构建 formData 对象
            let formData = new FormData($('#f1')[0]);
            $.ajax({
                url:'../add',
                type:'post',
                data:formData,
                processData:false, // 告诉 jquery 不要处理发送的数据类型
                contentType:false, // 告诉 jquery 不要设置请求头的 contentType
                success:function ( result ) {
                    if ( result.code === 200 ){
                        alert("上传成功");
                    } else {
                        alert("上传失败");
                    }
                }
            })
        })
    })
</script>

</body>
</html>
4、运行效果
1)单个文件
 2)多个文件

 三、实现文件下载

1、文件下载
  /**
     * 文件下载
     * @param fileName
     * @return
     */
    @GetMapping("/download/{fileName}")
    public ResponseEntity<InputStreamResource> download(@PathVariable("fileName") String fileName) throws Exception {
        // 文件下载目录(也就是上传路径)
        String downloadPath = "d://file/" + fileName;
        // 构建一个文件输入流读取服务器上的文件
        FileInputStream fis = new FileInputStream(downloadPath);
        // 设置响应头,告诉浏览器响应流程
        HttpHeaders headers = new HttpHeaders();
        // 对文件名进行编码,防止响应头中出现乱码
        fileName = URLEncoder.encode(fileName,"UTF-8");
        // 设置头信息,将响应内容处理的方式设置为附件下载
        headers.setContentDispositionFormData("attachment",fileName);
        // 设置响应类型为流类型
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 创建 InputStreamResource 对象封装输入流,用于读取服务器文件
        InputStreamResource isr = new InputStreamResource(fis);
        // 创建 ResponseEntity 对象(封装 InputStreamResource,响应头,以及响应状态码)
        ResponseEntity<InputStreamResource> entity = new ResponseEntity<>(isr, headers,HttpStatus.CREATED);
        return entity;
    }
2、运行效果 

 四、总结

本次案例只是简单的文件上传和下载,都是上传在本地,那可不可以上传到远程的服务器上呢?也是可以的,后面会出一个案例讲解怎么上传文件到远程服务器 minion 上。

五、gitee 案例

地址:ch08 · qiuqiu/SpringMVC - 码云 - 开源中国 (gitee.com)

举报

相关推荐

0 条评论