springboot项目学习-瑞吉外卖(4)

1.任务

这一节主要的任务是解决文件的上传下载功能

2.文件上传

概念:将本地的图片上传到浏览器上面

点击文件上传,前端就会发送如上的请求,服务端应该根据URL和请求方法来处理请求

CommonController类: 

@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {
    //将在配置文件中的路径参数赋给basePath
    @Value("${reggie.path}")
    private String basePath;
    
    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload (MultipartFile file){
        //file是一个临时文件(上传文件之后会放在临时文件夹里)本次请求结束之后,文件就会删除
        log.info(file.toString());

        //获取原始文件名
        String originalFilename = file.getOriginalFilename();
        //将原始文件名后缀拿到
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //使用UUID重新生成文件名并且拼接了后缀,为了防止重名
        String fileName = UUID.randomUUID().toString() + suffix;

        //如果存储路径不存在,则要先新建一个文件夹
        //创建一个目录对象
        File dir = new File(basePath);

        if (!dir.exists()){
            dir.mkdir();
        }

        //将文件存储在指定位置(防止临时文件删除)
        try {
            //basePath:存储路径
            //filename:文件名加后缀
            file.transferTo(new File(basePath+fileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //为什么返回文件名,因为当添加菜品的时候,我们需要把图片也存到菜品的表里,所以要知道文件名
        return R.success(fileName);
    }
}

前端input标签: 

application.properties: 

reggie.path=E:/springbootPicture/

分三个部分来介绍上面的代码

  • 首先是要接收前端传过来的文件,这里springmvc给我们提供了一个文件处理类MultipartFile,参数名这里由于是前端input标签里指定的name为file,所以参数名也必须是file
  • 当服务端接收到前端传来的图片之后,会把图片存放在临时文件中,当这个请求结束后,图片就会删除,所以接下来应该做的就是把图片存放在我们指定的目录下。这里的文件目录是放在了application.properties配置文件中了,然后在controller层中用@Value注解引入
  • 最后一步做了一个简单的判断,如果本地没有指定的文件目录,则就生成该目录,反之,就直接将获取的文件存放在该目录下

3.文件下载

前端页面先发送请求,然后服务端再通过输出流的方式,把它写回到浏览器页面,这样就能实现文件(图片)的展现

 当把图片上传之后,浏览器立马就会再次发送请求,路径里会把图片的name发送过来

   /**
     *
     * @param name  获取文件名
     * @param response  来操作流
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){

        try {
            //输入流(读取文件内容)
            FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));

            //输出流(将文件写回浏览器,在浏览器展示图片)
            //这里不new一个输出流,而是用response来get一个输出流,因为要返回给浏览器
            ServletOutputStream outputStream = response.getOutputStream();

            //设置响应类型(类型为图片)
            response.setContentType("image/jpeg");

            //通过输入流来读取文件
            byte[] bytes = new byte[1024];
            int length = 0;
            //如果length不为-1表示还没有读完,则一边读一边写
            while((length = fileInputStream.read(bytes)) != -1) {
                //向浏览器写文件内容,从0开始写到length为止
                outputStream.write(bytes,0,length);
            }

            //关闭资源
            fileInputStream.close();
            outputStream.close();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

上面的方法主要有以下几步:

  • new一个输入流,读取文件内容
  • 用response创建输出流,将文件写回浏览器
  • 关闭输入和输出流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/487864.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xcode生成静态库.a

一、生成静态库 1.打开 Xcode 创建一个新的 Static Library 工程&#xff0c;取名applestudio 2.创建工程完毕后&#xff0c;简化目录结构 删除系统自动创建的同名类&#xff1a;applestudio.h和applestudio.m 把自己的代码复制进去&#xff0c;如例子&#xff1a;guiconnect.h…

java Web餐馆订单管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 餐馆订单管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

Elasticsearch从入门到精通-07ES底层原理学习

Elasticsearch从入门到精通-07ES底层原理和高级功能 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f4d6; 本篇主要介绍和大家一块学习一下ES底层原理包括集群原理、路由原理、分配控制、分配原理、文档分析原理、文档并发安全原理以及一些高…

交换机高级-端口安全

端口安全 1、一旦接口开启端口安全功能&#xff0c;那么接口所学到的动态MAC就会转换成安全MAC地址&#xff1b; 2、安全MAC地址默认情况下只能学习1个&#xff0c;可以通过命令手动修改学习数量&#xff1b; 3、安全MAC地址没有老化时间&#xff08;但是依然存在内存中&…

iOS-UIFont 实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS-UIFont 实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

荟萃分析R Meta-Analyses 3 Effect Sizes

总结 效应量是荟萃分析的基石。为了进行荟萃分析&#xff0c;我们至少需要估计效应大小及其标准误差。 效应大小的标准误差代表研究对效应估计的精确程度。荟萃分析以更高的精度和更高的权重给出效应量&#xff0c;因为它们可以更好地估计真实效应。 我们可以在荟萃分析中使用…

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

介绍 将容器化应用程序部署到 Kubernetes 集群时&#xff0c;由于从 registry 中提取必要的容器镜像需要时间&#xff0c;因此可能会出现延迟。在应用程序需要横向扩展或处理高速实时数据的情况下&#xff0c;这种延迟尤其容易造成问题。幸运的是&#xff0c;有几种工具和策略…

360奇酷刷机 360刷机助手 QGDP360手机QGDP刷机

360奇酷刷机 360刷机助手 QGDP破解版360手机QGDP刷机 360手机刷机资源下载链接&#xff1a;360rom.github.io 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360奇酷刷机&#xff1a;360高通驱动安装 360手机刷机驱动&#xff1b;手机内置&#xff0c;可通过USB文件传输…

同城上门按摩服务平台,同城上门小程序搭建有具备哪些功能?

上门服务小程序系统通常包含以下功能&#xff1a; 1&#xff0e;用户注册和登录&#xff1a;用户可以在小程序中注册账号并登录&#xff0c;方便后续的预约和服务操作。 2&#xff0e;服务分类和展示&#xff1a;提供各种上门服务的分类&#xff0c;例如家政服务、保洁服务、维…

ChatGPT助力论文写作:详细步骤解析

前言 在论文写作过程中&#xff0c;尽管人工智能工具如ChatGPT能为我们提供有效的辅助&#xff0c;但我们必须铭记&#xff0c;这些工具并不能完全取代我们的思考与判断能力。本指南将详尽地展示如何利用ChatGPT辅助论文写作的全过程&#xff0c;旨在帮助您更高效地完成学术任…

JavaEE企业开发新技术3

目录 2.11 Method的基本操作-1 文字性概念描述 代码&#xff1a; 2.12 Method的基本操作-2 2.13 Method的基本操作-3 2.14 数组的反射操作-1 文字性概念&#xff1a; 代码&#xff1a; 2.15 数组的反射操作-2 学习内容 2.11 Method的基本操作-1 文字性概念描述 Me…

.NET分布式Orleans - 2 - Grain的通信原理与定义

Grain 是 Orleans 框架中的基本单元&#xff0c;代表了应用程序中的一个实体或者一个计算单元。 每个Silo都是一个独立的进程&#xff0c;Silo负责加载、管理和执行Grain实例&#xff0c;并处理来自客户端的请求以及与其他Silo之间的通信。 通信原理 在相同的Silo中&#xff0…

【数据结构】顺序表的定义

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

vscode下c++的boost库安装

Boost Downloadshttps://www.boost.org/users/download/下载最新的库文件。在shell中&#xff0c;使用命令bootstrap.bat gcc生成b2.exe文件。然后是.\b2.exe toolsetgcc生成库文件&#xff0c;在stage\lib文件夹下把stage\lib文件夹中的库文件拷贝到mingw64\x86_64-w64-mingw3…

小程序从入门到入坑:事件系统

前言 哈喽大家好&#xff0c;我是 SuperYing&#xff0c;本文是小程序从入门到入坑系列的第 3 篇&#xff0c;将比较详尽的讲解 小程序事件系统 的相关知识点&#xff0c;欢迎小伙伴阅读。 读完本文您将收获&#xff1a; 了解小程序事件及基础使用。了解小程序事件分类及多种的…

我们是如何在 IDE 中设计 AutoDev 的 AI 编程开发智能体语言与框架?

上周微软发布了自家的 AI 编程和软件开发智能体框架&#xff1a;AutoDev&#xff0c;其与我们开发的 IDE 插件 AutoDev 有颇多的相似之处&#xff0c;特别是一些设计思路&#xff0c;以及在对于辅助软件开发任务的智能体以及一些基础设施上。 稍有不同的是&#xff1a; 交互介质…

【YOLOV5 入门】——环境配置(Miniconda/Pytorch/YOLOv5/PYPI镜像源)

声明&#xff1a;笔记是毕设时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 计划&#xff1a; 入门篇&#xff1a;环境安装、模型检测、构建自定义数据集、训练数据集、可视化界面搭建、Web系统搭建。拓展篇&#xff1a;使用服务器训练、使用pycharm和…

LeetCode第2583题

难度&#xff1a;中等 给你一棵二叉树的根节点 root 和一个正整数 k 。树中的层和是指同一层上节点值的总和。返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。注意&#xff0c;如果两个节点与根节点的距离相同&#xff0c;…

每日一练:LeeCode-21、合并两个有序链表【链表+递归+非递归】

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

刚刚,百度和苹果宣布联名

百度 Apple 就在刚刚&#xff0c;财联社报道&#xff0c;百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提供 AI 功能。 苹果曾与阿里以及另外一家国产大模型公司进行过洽谈&#xff0c;最后确定由百度提供这项服务&#xff0c;苹果预计采取 API 接口的方式计费。 苹果将…