springmvc实现文件上传下载

2023-04-17 0 352

需求:再web项目中,可能会出现需要上传文件,如用户注册上传头像,上传照片,或其他资源等

springmvc实现文件上传:

1.导入jar包:

springmvc实现文件上传下载

2设置表单:

<!--当表单中存在文件上传时,需要再form表单中添加enctype=\"multipart/form-data\"属性,而且提交方式必须为post请求,不然上传图片等会报错-->
<form action=\"../file\" method=\"post\" enctype=\"multipart/form-data\">
    <input type=\"file\" name=\"img\">
    <input type=\"submit\">
</form>

3.设置文件上传视图解析器:

<!--配置文件上传视图解析器-->
    <bean id=\"multipartResolver\" class=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\">
        <!--设置编码格式-->
        <property name=\"defaultEncoding\" value=\"utf-8\"/>
        <!--设置文件最大的大小10M-->
        <property name=\"maxInMemorySize\" value=\"#{10*1024*1024}\"/>
    </bean>

4.上传功能后台:

@Controller
public class FileController {

    /*@RequestParam(\"img) 将前端请求中指定name的数据放入参数中*/
    @RequestMapping(\"/file\")
    public String file(@RequestParam(\"img\") MultipartFile file, HttpServletRequest request) {
//        获取原始文件名
        String trueName = file.getOriginalFilename();
//        设置文件保存的路径:当前项目的下的/static/upload/文件夹下;因为运行时是编译后的文件再tomcat服务器中运行,
//        因此查看是否上传成功需要再class文件中查看
        String path = request.getSession().getServletContext().getRealPath(\"/static/upload/\");
//        设置上传文件保存本地的文件名及路径
        File file1 = new File(path + trueName);
//        判断当前文件父级文件夹是否存在,如果不存在,就创建文件夹
        if (!file1.getParentFile().exists()) {
            file1.mkdirs();
        }
        try {
//            上传文件,核心功能
            file.transferTo(file1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return \"index\";
    }
}

一个最简单的上传功能就完成了,不过这种方式并不好,因为如果有多人操作,出现上传文件名相同等问题,会覆盖,因此要生成一个不会重复的文件名:

1.使用时间来设置文件名:

springmvc实现文件上传下载

上传后保存路径:

springmvc实现文件上传下载

2.使用UUID类:

springmvc实现文件上传下载

其他的内容都一样,生成文件名如下:

springmvc实现文件上传下载

文件的下载:

 1.可以直接前端设置a标签连接文件地址:

springmvc实现文件上传下载

右击链接另存就可以下载了;

2.写一个后台控制器:

package com.zs.controller;

import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

@Controller
public class DownLoadController {

    @RequestMapping(\"/down\")
    public ResponseEntity<byte[]> download(@RequestParam(\"filename\") String filename, HttpServletRequest request) throws IOException {
        String path = request.getSession().getServletContext().getRealPath(\"/static/upload/\");
        File file = new File(path + filename);

        String encodedFileName = null;
//        获取User-Agent,借此判断是哪儿种类型的浏览器
        String header = request.getHeader(\"User-Agent\");
        if (header.indexOf(\"Chrome\") > 0)
            encodedFileName = URLEncoder.encode(filename, \"utf-8\").replaceAll(\"+\", \"%20\");
        else
            encodedFileName = MimeUtility.encodeWord(filename);

        byte[] bytes = FileUtils.readFileToByteArray(file);
        HttpHeaders headers = new HttpHeaders();
        //设置响应的文档类型:二进制形式
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //弹出下载窗口,并制定文件名
        headers.setContentDispositionFormData(\"attachment\", encodedFileName);
        //状态码
        HttpStatus httpStatus = HttpStatus.CREATED;
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, httpStatus);
        return responseEntity;
    }
}

前端页面传要下载的图片名:

springmvc实现文件上传下载

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务