第四章 SpringBoot整合Web开发(二)

一、文件上传

  • springmvc对文件上传做了简化,springboot做了更近一步的简化,使文件上传更加方便。
  • java中的文件上传涉及到两个组件,一个是CommonsMultipartResolver,另一个是StandardServletMultipartResolver,第一个是使用commons-fileupload来处理multipart请求(需要添加commons-fileupload的jar包),第二个是基于servlet3.0来处理multipart请求的,tomcat7中就已经支持servlet3.0,而springboot2.0内置tomcat8,所以springboot不需要添加额外的jar包就能实现文件上传功能。
  • springboot提供的文件上传的配置类类MultipartAutoConfiguration默认也是使用StandardServletMultipartResolver。

二、实战

2.1 单文件上传
  • 创建springboot项目,而不是maven项目
  • 导入依赖spring-boot-starter-web 依赖
  • 在resource的static目录里创建一个upload.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="uploadFile" value="选择文件">
    <input type="submit" value="上传">
</form>

</body>
</html>
  • 接口
/**
 * @Author ljs
 * @Description 上传文件
 * @Date 2019/4/26 17:12
 **/
@RestController
public class FileUploadController {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

    @RequestMapping("/upload")
    public String upload(MultipartFile uploadFile, HttpServletRequest request){
        //1、上传文件保存路径为项目运行目录下的uploadFile文件夹,并在文件夹中通过日期对所上传的文件归类保存
        String realPath = request.getSession().getServletContext().getRealPath
                ("/uploadFile/");


        String format = sdf.format(new Date());
        File folder = new File(realPath + format);
        if(!folder.isDirectory()){
            folder.mkdirs();
        }
        //2.给上传的文件重命名避免重名
        String oldName = uploadFile.getOriginalFilename();
        String newName = UUID.randomUUID().toString() + oldName.substring
                (oldName.lastIndexOf("."), oldName.length());
        try{
            //3.保存操作
            uploadFile.transferTo(new File(folder, newName));
            //4.生成上传文件的访问路径,并将路径返回
            String filePath = request.getScheme() + "://" + request
                    .getServerName() + ":" + request.getServerPort() +
                    "/uploadFile/" + format + "/" + newName;
            return filePath;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传失败";
    }
}

  • 运行


    image.png

    image.png
  • 是保存在项目运行目录下的,之前访问静态资源有5个路径,其中一个/就是运行目录下,所以可以直接访问。
  • 对图片上传细节的一些设置,基本上不用,只要关注上传逻辑就行。


    image.png
2.2 多文件上传
  • 创建uploads.html
<body>
<form action="/uploads" method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFiles" value="请选择文件">
    <input type="file" name="uploadFiles" value="请选择文件">
    <input type="submit" value="上传">
</form>
  • controller,就是套一个for循环
@PostMapping("/uploads")
    public String uploads(MultipartFile[] uploadFiles, HttpServletRequest req) {
        for (MultipartFile uploadFile : uploadFiles) {
            String realPath = req.getSession().getServletContext().getRealPath("/uploadFile/");
            System.out.println(realPath);
            String format = sdf.format(new Date());
            File folder = new File(realPath + format);
            if (!folder.isDirectory()) {
                folder.mkdirs();
            }
            String oldName = uploadFile.getOriginalFilename();
            String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."), oldName.length());
            try {
                uploadFile.transferTo(new File(folder, newName));
                String filePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/uploadFile/" + format + newName;
//            return filePath;
                System.out.println(filePath);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "上传失败!";
    }

  • 运行


    image.png

    image.png

三、@ControllerAdvice

  • @ControllerAdvice 主要用来处理全局数据,主要搭配@ExceptionHandler、@ModelAttribute 以及@InitBinder来使用。
3.1 全局异常处理
  • @ControllerAdvice配合@ExceptionHandler定义全局异常捕获机制。例如上传文件超过了限制的大小就会抛出异常。
  • 定义全局异常捕获的步骤
    1. 定义一个CustomExceptionHandler类,加上@ControllerAdvice注解,表明这个类会被扫描到spring容器中。
    2. 接着开始定义处理各种异常的方法,例如uploadException,加上@ExceptionHandler(MaxUploadSizeExceededException.class),表明该方法来处理MaxUploadSizeExceededException类型异常。如果想处理所有异常,把MaxUploadSizeExceededException换成Exception即可。方法的参数可以有异常实例、HttpServletResponse、HttpServletRequest 以及Model ,返回值可以是 JSON,ModelAndView 和一个逻辑视图名等。
/**
 * @Author ljs
 * @Description 全局异常捕获
 * @Date 2019/4/27 20:29
 **/

@ControllerAdvice
public class CustomExceptionHandler {

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public void uploadException(MaxUploadSizeExceededException e,
                                HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.write("上传文件大小超出限制!");
        out.flush();
        out.close();
    }
}
  • 跟着之前的
3.2 添加全局数据

@ControllerAdvice配合@ModelAttribute可以进行全局数据配置。
全局配置类GlobalConfig添加userInfo方法,返回一个Map,其中info表示key,map表示value。

@ControllerAdvice
public class GlobalConfig {
    @ModelAttribute(value = "info")
    public Map<String, String> userInfo(){
        HashMap<String, String> map = new HashMap<>();
        map.put("username", "李建生");
        map.put("gender", "男");
        return map;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容