手写一个文件上传demo

news2024/11/24 18:53:50

背景

最近闲来无事,同事闻了一下上传文件的基本操作,如何用文件流来实现一个文件的上传功能

基本概念

   流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。可以按照数据传输的方向,将流可分为输入流和输出流,它是java中相对比较重要的知识点,无论是考试、面试,还是实际工作过程中,这都是经常能够使用到的身影。希望各位看官们可以更好地了解流的相关知识。

输入流

Java 流相关的类都封装在 java.io 包中,而且每个数据流都是一个对象。所有输入流类都是 InputStream 抽象类(字节输入流)以及 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类,其层次结构如下图 所示。

Java 中的字符他其实是 Unicode 编码,即双字节,而 InputerStream 是用来对单字节处理的,在处理字符文本时显得不是很方便。这时可以使用 Java中 的文本Reader 类(输入流 ),该类是字符输入流的抽象类,即所有字符输入流的实现都是它的子类,该类的方法与 InputerSteam 类的方法类似,这里不再介绍。

以上是关于输入流的基本概念,下面我们直接上代码。实现我们的文件上传功能

输出流

在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类,其层次结构如下图所示。

OutputStream 类是所有字节输出流的超类,用于对以二进制的形式将数据写入目标设备,该类是抽象类,不能被实例化。OutputStream 类提供了一系列跟数据输出有关的方法, 

 代码如下

    public ApiResult upload(@NotNull(message = "上传参数不能为空") @RequestParam("file")MultipartFile[] file) throws BaseException{
        for (int i = 0; i < file.length; i++) {
            String originalFilename = file[i].getOriginalFilename();
            String type = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            if(!getPicTypeMap().containsKey(type.toLowerCase())){
              throw new ParamException("只允许上传png、jpg格式图片或者pdf");
            }
            // TODO 此处未做大小显示如果想要限制,放开就好
            if(type.equalsIgnoreCase("png") || type.equalsIgnoreCase("jpg") ){
                if(file[i].getSize() > 5120){
                    throw new ParamException("图片超过了限制");
                }
            }
            if(type.equalsIgnoreCase("mp4")){
                if(file[i].getSize() > 512000){
                    throw new ParamException("视频超过了限制");
                }
            }
            if(type.equalsIgnoreCase("pdf") ){
                if(file[i].getSize() > 30720){
                    throw new ParamException("pdf超过了限制");
                }
            }
          /*  if(file[i].getSize() > 设定的值){
                throw new ParamException("上传内容超过了限制");
            }*/
        }

        ApiResult apiResult = new ApiResult();

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        String format = simpleDateFormat.format(new Date());
        String realPath = filePath + File.separator + format;
        String returnPath = format;
        File targetFile = new File(realPath);
        if (!targetFile.exists()){
            targetFile.mkdirs();
        }
        FileOutputStream bos = null;
        for (int i = 0; i < file.length; i++) {
            try {
                String fileName = UUID.randomUUID().toString().replace("-","");
                //获取文件后缀(.txt)
                String extendFileName = file[i].getOriginalFilename().substring(file[i].getOriginalFilename().lastIndexOf('.'));
                String str = targetFile + File.separator + fileName + extendFileName;
                // 此处是外面要访问的,所以必须添加
                returnPath = returnPath  + "/" + fileName + extendFileName;
                logger.info(str);
                bos = new FileOutputStream(str);
                bos.write(file[i].getBytes());
                apiResult.getData().put("filePath","/" + returnPath);
            }catch(FileNotFoundException e){
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally{
                try {
                    bos.flush();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            logger.info("上传成功");
        }
        return apiResult;
    }

今天的文章到此就结束了,欢迎大家留言交流,也可以点击下方的卡片关注一波

这篇文章2000多字,你却说因为文字段被标记为质量低,以下文字就是为了打破它的文字段而造成的质量低!

相信和我一样遇到这个问题的的小伙伴们,心里也已经暗自问候了这个产品经理的祖总十八代了吧!

算法实在是不敢苟同,文字的长短和文章的质量有毛线的关系吗?

这篇文章因为文字段被标记为质量低,以下文字就是为了打破它的文字段而造成的质量低!

相信和我一样遇到这个问题的的小伙伴们,心里也已经暗自问候了这个产品经理的祖总十八代了吧!

算法实在是不敢苟同,文字的长短和文章的质量有毛线的关系吗?

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

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

相关文章

Vue3:有关v-model的用法

目录 前言&#xff1a; 回忆基本的原生用法&#xff1a; 原生input的封装&#xff1a; 自定义v-model参数&#xff1a; 对el-input的二次封装&#xff1a; 多个v-model进行绑定: v-model修饰符&#xff1a; v-model自定义参数与自定义修饰符的结合&#xff1a; 前言&am…

Java 网络编程 Ⅰ

目录基础知识IP 和 Portinternet&#xff08;互联网&#xff09;Java UDP 编程UDP&#xff08;User Datagram Protocol&#xff09;&#xff1a;无连接无状态的数据报通讯协议实现Java TCP 编程TCP&#xff08;Transmission Control Protocol&#xff09;&#xff1a;面向连接的…

XSS注入进阶练习篇(三) XSS原型链污染

XSS原型链污染1.原型链的概念1.1 构造函数的缺点1.2 prototype 属性的作用1.3 原型链1.4 constructor属性1.5 prototype和__proto__2. 原型链污染2.1 原型链污染是什么&#xff1f;2.2 原型链污染的条件2.3 原型连污染实例2.3.1 hackit 20182.3.2 challenge-04223.总结1.原型链…

Java跳槽涨薪之路-想学Java的赶紧上车了

前言Java 是近 10 年来计算机软件发展过程中的传奇&#xff0c;在很多开发者心中的地位可谓“爱不释手”&#xff0c;与其他一些计算机语言随着时间的流逝影响也逐渐减弱不同&#xff0c;Java 随着时间的推移反而变得更加强大。按应用范围&#xff0c;Java 可分为 3 个体系&…

【Unity3D】空间和变换

1 空间 1.1 左右手坐标系及其法则 1.1.1 左右手坐标系 左手坐标系与右手坐标系Unity 局部空间、世界空间、裁剪空间、屏幕空间都采用左手坐标系&#xff0c;只有观察空间采用右手坐标系。 左右手坐标系除了坐标系朝向&#xff08;旋向性&#xff09;不同&#xff0c;还存在以…

顶象APP加固的“蜜罐”技术有什么作用

目录 蜜罐有很多应用模式 蜜罐技术让App加固攻守兼备 顶象端加固的三大功能 为了捕获猎物&#xff0c;猎人会在设置鲜活的诱饵。被诱惑的猎物去吃诱饵时&#xff0c;就会坠入猎人布置好的陷阱&#xff0c;然后被猎人擒获&#xff0c;这是狩猎中常用的一种手段。在业务安全防…

自动化测试框架设计

大数据时代&#xff0c;多数的web或app产品都会使用第三方或自己开发相应的数据系统&#xff0c;进行用户行为数据或其它信息数据的收集&#xff0c;在这个过程中&#xff0c;埋点是比较重要的一环。 埋点收集的数据一般有以下作用&#xff1a; 驱动决策&#xff1a;ABtest、漏…

华为OD机试用Python实现 -【微服务的集成测试】(2023-Q1 新题)

华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 微服务的集成测试…

信号的运算与变换

目录 前言 本章内容介绍 信号的运算与变换 相加 相乘 时移 反折 尺度变换 微分&#xff08;差分&#xff09; 积分&#xff08;累加&#xff09; 信号的奇偶求解 信号的实虚分解 合适的例题 1、时移反折 2、时移尺度 3、时移反折尺度 4、反求x(t) 前言 《信号…

gma 1.1.3 (2023.02.22) 更新日志

&#xff08;实际版本日期&#xff1a;2023.02.14&#xff09; 重要更新&#xff1a; 从本版本开始&#xff0c; gma 开始支持 Python 3.11&#xff01; 新增&#xff1a; 1、map 增加【AddDataSetDiscrete】添加离散型栅格数据集绘制功能。 2、math a、添加 Stretch 数据…

2023年PMP考试应该注意些什么?

首先注意&#xff08;报考条件&#xff09; 2023年PMP考试报名流程&#xff1a; 一、PMP英文报名&#xff1a; 英文报名时间无限制&#xff0c;随时可以报名&#xff0c;但有一年的有效期&#xff0c;所以大家尽量提前报名&#xff0c;在英文报名有效期内进行中文报名。 英…

儿童饰品发夹发卡出口美国办理什么认证?

亚马逊美国站上传新产品&#xff0c;很多时候都是需要类目审核的&#xff0c;后台给出要求提供认证&#xff0c;产品类目不同&#xff0c;所需要提供的认证证书是不一样&#xff0c;儿童产品需要提交的是CPC认证&#xff0c;玩具&#xff0c;母婴用品&#xff0c;儿童书包&…

前端面试题整理之HMTL篇(二)

HTML面试题&#xff08;二&#xff09; 前言&#xff1a; 面试题及答案解析&#xff0c;大部分来自网络整理&#xff0c;我自己做了一些简化&#xff0c;内容有很多部分已经重复&#xff0c;解释也有些乱&#xff0c;大家带着自己的思考去看&#xff0c;整理自己的语言&#x…

python中savgol_filter的详细解释

目录savgol_filter简介savgol_filter原理参数window_length对平滑的效果参数polyorder的平滑效果savgol_filter简介 Savitzky-Golay滤波器最初由Savitzky和Golay于1964年提出&#xff0c;是光谱预处理中常用滤波方法&#xff0c;它的核心思想是对一定长度窗口内的数据点进行k阶…

数据结构与算法(四):树结构

前面讲到的顺序表、栈和队列都是一对一的线性结构&#xff0c;这节讲一对多的线性结构——树。「一对多」就是指一个元素只能有一个前驱&#xff0c;但可以有多个后继。 一、基本概念 树&#xff08;tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有穷集。n0时称…

魔兽世界私服架设教程—GM命令大全

如果需要什么命令可以按ctrlf查找&#xff0c;比如泰坦之握&#xff0c;就会直接定位到你想要的命令那里。橙色武器&#xff1a;85版本橙匕首&#xff0c;龙父之牙戈拉德&#xff0c;龙王之暮提里奥什&#xff0c;远古噩梦7794977950橙杖&#xff0c;可以变龙巨龙之怒&#xff…

Ae:场景编辑检测

场景编辑检测基于 Adobe Sensei 技术&#xff0c;能够自动检测已编辑剪辑中的场景变化&#xff0c;并将场景创建为标记或图层&#xff0c;以便加快项目设置。首先将素材添加到时间轴&#xff0c;然后选择一个或多个素材图层&#xff0c;右键单击并选择“场景编辑检测”。Ae菜单…

【华为OD机试真题】用 C++ 实现 - 数字加减游戏

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

从「雄狮」到「瑶光」,奇瑞历史突破背后的十字路口

传统自主品牌&#xff0c;正走到关键的十字路口。 奇瑞官方数据显示&#xff0c;2022年奇瑞集团创造了四个“历史首次”突破&#xff0c;包括年营业收入首次突破2000亿元&#xff1b;年销量首次超100万辆&#xff1b;年出口首次抵达45万辆&#xff1b;新能源年销量首次超过20万…

华为OD机试 - 组装新的数组(Python)【2023-Q1 新题】

华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 组装新的数组 题…