【Javaweb】【瑞吉外卖】上传下载实现

上传文件

原理:前端让用户选择一个文件,点击丢给后端上传,后端servlet接收到这些请求就进行应答构建连接,完了就开始接收。
但实现这些原理可以不是很懂。servlet封装了一下,spring boot也封装了一下。实现就比较简单。

实现过程:

  1. 确定下载的目标路径
  2. 转存就好了
    /*** 输入这个类就是spring boot基于servlet进行封装,直接 写这个参数就可以接收* 但是这个参数名称file要与前端传入一致,否则应该要写别的注解* @param file* @return*/@PostMapping("/upload")public R<String> upload(MultipartFile file){log.info(file.toString());// 看一下输入的basePath是否建了目录// 否则不会自己建目录会报错File dir = new File(basePath);if (!dir.exists()){dir.mkdir();}String originPathName = file.getOriginalFilename();// 由于如果按照源文件名字保存,可能会重名,所以使用UUID进行编码然后保存// 拼接一下拓展名,就好了String suffix = originPathName.substring(originPathName.lastIndexOf("."));String prefix = UUID.randomUUID().toString();String fileName = prefix + suffix;try {// 最后调用transfer就可以转存了file.transferTo(new File(basePath + fileName));} catch (IOException e) {e.printStackTrace();}return R.success(fileName);}

下载文件

下载文件稍稍会复杂一些些,但其实也还好,就是用文件IO流就好了。
保存好的文件是保存在了服务端刚刚设置的文件夹下,拿着时候相对于服务端程序就是需要input一下,将upload的文件读入程序,然后再去找一个output输出就好了。

实现过程:

  1. 开启文件IO流将保存的文件读入程序。
  2. 从HTTP Response里面获得输出流,往里面写就好了。
@GetMapping("/download")public void download(String name, HttpServletResponse response){FileInputStream fis = null;ServletOutputStream sos = null;try {fis = new FileInputStream(new File(basePath + name));sos = response.getOutputStream();int len = 0;byte[] bytes = new byte[1024];while ((len = fis.read(bytes) ) != -1){sos.write(bytes);}sos.flush();} catch (Exception e) {// e.printStackTrace();}  finally {try {fis.close();sos.close();} catch (Exception e) {// e.printStackTrace();}}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是大顶堆?举个例子

一、什么是大顶堆&#xff1f; 大顶堆&#xff08;Max Heap&#xff09;是一种二叉堆的实现&#xff0c;它满足以下性质&#xff1a; 任意节点的值都大于等于其子节点的值。根节点&#xff08;堆顶&#xff09;的值是整个堆中最大的。 大顶堆通常用于实现优先队列等数据结构…

嘿!终于等到了!应用开发云资源套餐如约而至!

MemFire Cloud平台更新啦&#xff01;&#xff01;此次更新我们推出了万众期待的计费套餐&#xff0c;下面给大家带来详细的介绍~ 计费模式为“基础套餐按量付费”&#xff0c;您可选择购买带有一定配额的基础套餐&#xff0c;超出配额部分可以通过开启“超限按量”功能来转为…

C语言入门学习 --- 4.数组

文章目录 第四章数组1.一维数组的创建与初始化。1.1一维数组的创建1.2一维数组的初始化1.3一维数组的使用1.4一维数组在内存中的存储 2.二维数组的创建与初始化2.1二维数组的创建2.2二维数组的初始化2.3二维数组的使用 2.4二维数组在内存中的存储3.数组越界4.数组作为函数参数4…

AbilityStorage理解与反思

1.简介&#xff1a; AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 2.那么Module分为三类&#xff1a;Hap,Har,Hsp 官网上的表述容易误解&#xff1a;实际上AbilitySta…

表单修饰符和事件修饰符

表单修饰符和事件修饰符 表单修饰符 v-model.lazy v-model.lazy 失去焦点后再收集数据 <div id"app"><textarea name"" id"" cols"30" rows"10" v-model.lazy"a"></textarea>{{a}}<textar…

【深度学习】深度估计,Depth Anything Unleashing the Power of Large-Scale Unlabeled Data

论文标题&#xff1a;Depth Anything Unleashing the Power of Large-Scale Unlabeled Data 论文地址&#xff1a;https://arxiv.org/pdf/2401.10891.pdf 项目主页&#xff1a;https://depth-anything.github.io/ 演示地址&#xff1a;https://huggingface.co/spaces/LiheYoung…

PyCharm 中 Python 解释器的配置

温馨提示&#xff1a;本文 PyCharm 版本是 2022.3.3 前言 作为 Python 新手&#xff0c;在了解了基本语法之后&#xff0c;肯定得先用 IDE 工具写个 Hello World&#xff0c;来了解 Python 编程语法及 IDE 工具的常规配置和使用&#xff0c;这里我用的 IDE 工具是 PyCharm。 …

C++:构造函数赋初值的几种形式

构造函数用于类对象的初始化&#xff0c;没有返回值也不用写void&#xff0c;函数名与类名相同。构造函数可以有形参也可以无参&#xff0c;构造函数要写在类里边。语法&#xff1a;public: 类名(){ *** }。构造函数在创建对象&#xff08;实例化&#xff09;时会被调用且只有一…

leetcode第49题字母异位词分组

49. 字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 输入: strs ["eat", "tea", "tan", "ate", "na…

2024年服务器硬件知识普及篇(需要配置服务器的朋友可以参考)

嘿&#xff0c;大家好&#xff01;今天我们要聊一聊服务器硬件。无论你是想自己搭建一个服务器&#xff0c;还是对服务器硬件感兴趣&#xff0c;这篇文章都会对你有所帮助。我会尽量用简单易懂的语言&#xff0c;带你了解服务器硬件的基础知识。准备好了吗&#xff1f;让我们开…

unicloud update 修改

update 修改 使用腾讯云时更新方法必须搭配doc、where方法使用&#xff0c;db.collection(‘test’).update()会报如下错误&#xff1a;param should have required property ‘query’ collection.doc().update(Object data)未使用set、remove更新操作符的情况下&#xff0c…

odoo中_name_search用法

_name_search是Odoo中一个重要的方法&#xff0c;用于实现模型记录的搜索逻辑。这个方法通常在后端被调用&#xff0c;以便在Odoo的各种视图中&#xff08;如下拉列表选择框&#xff09;搜索和筛选记录。_name_search是模型中的一个API方法&#xff0c;可以被重写以自定义搜索逻…

一维数组_校门外的树

任务描述 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴0的位置&#xff0c;另一端在L的位置&#xff1b;数轴上的每个整数点&#xff0c;即0&#xff0c;1&#xff0c;2&#xff…

如何通过libusb直接向zebra打印机发送zpl,跨平台win/linux

环境&#xff1a;windows & linux & Zebra打印机gt820 windows: 之前安装了Zebra打印机官方驱动&#xff0c;所以先卸载掉驱动。再安装Zadig&#xff0c;用Zadig工具来安装WinUSB驱动。 zadig下载&#xff1a;Zadig - USB driver installation made easy 记住这两个数…

基金评价指标3——滚动收益率测算(近N日收益率,当周/月/年平均收益率)

文章目录 各个指标1. 近N日收益率2. 当周/月/年平均收益率 示例代码 各个指标 1. 近N日收益率 近N日收益率 (当日累计收益 - N日前的累计收益) / N日前的累计收益 2. 当周/月/年平均收益率 这里需要区分不同时间段的起始与终止区间 区间收益率 (区间终值累计收益 - 区间…

c语言指针基础下(下)

指针 字符指针变量 字符串变量的一般使用 int main() {char ch w;char* p &ch;*p h;printf("%c", ch);return 0; }上面就是通过指针的解引用改变了ch的值 int main() {char* p "ni hao a";//这个是常量字符串printf("%s\n", p);//打印…

超融合如何助力水务公司实现虚拟化与容器环境统一管理?

近些年&#xff0c;企业 IT 基础架构现代化转型的步伐逐渐加快&#xff0c;不少金融、医疗、政府等行业的用户&#xff0c;已在生产环境部署 Kubernetes 等云原生基础设施&#xff0c;为业务应用提供敏捷支持。不过&#xff0c;一些企业的容器化转型仍处于起步阶段&#xff0c;…

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …

Instant --java学习笔记

Instant 时间线上的某个时刻 / 时间戳过获取lnstant的对象可以拿到此刻的时间&#xff0c;该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数不够1秒的纳秒数 Instant的常见方法&#xff1a; Instant可以用来记录代码的执行时间&#xff0c;或用于记录用户操作某…

面试经验分享 | 通关某公司面试靶场

0x00:探测IP 首先打开时候长这个样&#xff0c;一开始感觉是迷惑行为&#xff0c;试了试/admin&#xff0c;/login这些发现都没有 随后F12查看网络&#xff0c;看到几个js文件带有传参&#xff0c;就丢sqlmap跑了一下无果 随后也反查了域名一下&#xff0c;发现没有域名&#…