SpringBoot:使用application/octet-stream 流式上传大文件,解决Mutipartfile multipart/form-data上传产生临时文件问题

article/2025/10/28 21:50:15

目录

  • multipart原理简介
    • multipart的流是服务器临时文件流
    • multipartfile生成临时文件到默认文件夹
    • 临时文件的目录可配
    • Mutipartfile的文件默认来自临时文件
  • Mutipartfile产生临时文件的好处坏处
    • 好处
    • 坏处
  • 纯流式上传application/octet-stream

multipart原理简介

multipart的流是服务器临时文件流

multipart的流不是HTTPRequest的流,而是服务器的临时文件流

multipart/form-data是表单上传,接口可以从Mutipartfile对象获取输入流getInputStream,表面上看没产生临时文件
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest的getInputStream

		@Overridepublic InputStream getInputStream() throws IOException {return this.part.getInputStream();}

这里面的流是从DiskFileItem(一眼磁盘)拿的,还告诉了你临时目录位置location
在这里插入图片描述

multipartfile生成临时文件到默认文件夹

从原理上看,在tomcat源码的org.apache.catalina.connector.Request类中,parseParts方法就将multipart格式的请求中文件生成到临时文件夹

			File location;String locationStr = mce.getLocation();if (locationStr == null || locationStr.length() == 0) {location = ((File) context.getServletContext().getAttribute(ServletContext.TEMPDIR));} else {// If relative, it is relative to TEMPDIRlocation = new File(locationStr);if (!location.isAbsolute()) {location = new File((File) context.getServletContext().getAttribute(ServletContext.TEMPDIR),locationStr).getAbsoluteFile();}}

临时文件的目录可配

这个location就是javax.servlet.MultipartConfigElement的配置,可以通过spring.servlet.multipart系列配置的location指定临时文件目录,这个临时文件用完,也会被自动清除

    private final String location;// = "";private final long maxFileSize;// = -1;private final long maxRequestSize;// = -1;private final int fileSizeThreshold;// = 0;

Mutipartfile的文件默认来自临时文件

Mutipartfile的注释中说明了,文件是stored in memory or temporarily on disk,存在内存或磁盘临时文件的,所以上传大文件时,会发现前端进度条走完了,代码才走进自己写得接口代码

/*** A representation of an uploaded file received in a multipart request.** <p>The file contents are either stored in memory or temporarily on disk.* In either case, the user is responsible for copying file contents to a* session-level or persistent store as and if desired. The temporary storage* will be cleared at the end of request processing.** @author Juergen Hoeller* @author Trevor D. Cook* @since 29.09.2003* @see org.springframework.web.multipart.MultipartHttpServletRequest* @see org.springframework.web.multipart.MultipartResolver*/
public interface MultipartFile extends InputStreamSource {

Mutipartfile产生临时文件的好处坏处

好处

帮开发封装了上传逻辑
可以在此基础实现切片上传到本地最后合并

坏处

对我来说
文件转储时间翻倍:我的文件存储服务器不是接收请求的服务所在服务器,我还得把文件转存到文件服务器,而服务到文件服务器还得再传一遍,时间基本double
前端进度不真实:前端显示的上传进度仅是浏览器给到服务的进度
占用资源:临时文件多少占点服务器磁盘空间

纯流式上传application/octet-stream

一段半伪代码,application/octet-stream参数体只能有文件,参数通过放headers里给就可以解决这个问题

    @PostMapping(value = "/upload", headers = "content-type=application/octet-stream;charset=utf-8")public Object upload(HttpServletRequest request,@RequestHeader("userId") String userId,@RequestHeader("fileName") String fileName,@RequestHeader("fileSize") String fileSize,@RequestHeader("dirId") String dirId) {try (InputStream in = request.getInputStream()) {fileName = URLDecoder.decode(fileName,"utf-8");uploadFileServer(in, fileName, fileSize, userId, dirId);return "success";} catch (Exception e) {log.error("上传报错", e);return "error";}}

http://chatgpt.dhexx.cn/article/cgd6xd51.shtml

相关文章

请求后端出现“Content type ‘application/octet-stream‘not supported“错误解决方案

首先看报错。此报错是Springboot 报错。 看看Postman 正确的传递方式。 Vue应该怎么传递呢&#xff1f;使用 FormData 对象。 // 通过这个方式就可以指定 ContentType 了 form_data.append(req, new Blob([JSON.stringify({a: 1, b: 2})], {type: application/json}))说明…

crontab

1、先手动执行定时任务以此来判断脚本是否有问题。 2、确认服务器是否开启定时任务计划服务 命令&#xff1a;service crond status service crond start 3、检查定时任务配置的语法 crontab -l SHELL/bin/bash 0 15 * * 1-5 cd /root/ye/project/StatShareDataProject/&…

记 Content type ‘application/octet-stream‘ not supported

项目场景&#xff1a; 实现一个入参方式为RequestPart RequestParam(“files”)的接口&#xff0c;即该接口要包含文件上传和其它(实体类)入参。 示例代码&#xff1a; PostMapping(value "", consumes {"multipart/form-data"})public Map<String,…

No converter for [class XXX] with preset Content-Type ‘application/octet-stream;charset=UTF-8‘

场景 此接口是下载文件&#xff0c;但逻辑中存在异常情况&#xff0c;并且响应对象设置了此响应头&#xff1a; response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);当内部抛出了异常后并且给了一个通用的实体对象&#xff0c;是JSON格…

Octet 和 Byte 的区别

2019独角兽企业重金招聘Python工程师标准>>> 关于程序的文章中 Octet 和 Byte是常见的词汇&#xff0c; 他们都表示8 bit。在读RFC或网络设备文档时&#xff0c;经常见到Octet这量词来指代8位&#xff08;bit&#xff09;&#xff0c;为啥不用Byte呢&#xff1f;有啥…

关于ESI研究前沿的思考和使用方法研究

边文越 李国鹏 周秋菊 冷伏海中国科学院科技战略咨询研究院。原文发表于《情报学报》DOI&#xff1a;10.3772/j.issn.1000-0135.2022.03.004 摘要 近年来&#xff0c;Essential Science Indicators&#xff08;ESI&#xff09;数据库研究前沿成为国内外情报学界的研究热点…

SCI、EI论文检索及论文的主要的获取方式

论文检索 sci论文查找地方&#xff1a;http://apps.webofknowledge.com/UA_GeneralSearch_input.do?productUA&search_modeGeneralSearch&SIDP1cfptv3ttGUh2YIFOM&preferencesSavedei论文查找地方&#xff1a;http://www.engineeringvillage.com/search/quick.ur…

收官:论文 IEEE ACCESS 期刊录取

自己做事&#xff0c;好做个记录。 上&#xff1a;努力&#xff1a;论文CCCV 2017录取通知 去年10月&#xff0c;将CCCV 2017会议论文扩充为期刊论文。那会儿心还野着&#xff0c;没想着弄这事&#xff0c;应付周任务&#xff0c;随便加了点东西&#xff0c;扩充了几百来字。…

计算机科学双一流大,基于ESI高被引论文和篇均被引的42所双一流大学排名揭晓,很靠谱...

2018年11月&#xff0c;最新的ESI数据已经更新&#xff0c;多所国内大学入围ESI全球大学榜单&#xff0c;中国科学院大学更一跃超过北京大学成为国内第一。但我们要知道ESI本身是一个基于具体论文总数、论文总引用量的规模排名&#xff0c;这样一些办学规模大、专业设置多、论文…

SCI\EI以及大学毕业论文 参考文献 在文章内的引用

参考文献怎么一个一个引入到文章中呢&#xff1f; 其实这个问题灰常简单&#xff0c;wps几下就解决了&#xff0c; 插入->交叉引用 弹出的窗口里选择一下引用类型&#xff08;T&#xff09;&#xff1a;编号项 引用内容&#xff08;R&#xff09;&#xff1a;段落编号…

IEEE Access论文录取!

搞定小论文、专利。下面主要从IEEE Access的投稿周期、评审意见、相关经验/技巧来说明这次投稿过程&#xff0c;希望对后面投稿的同行有所帮助。 IEEE Access&#xff1a;SCI 二区&#xff0c;我的小类学科是&#xff1a;Computer science, information systems 计算机&…

如何15天之内发表一篇ei会议英文论文?

目录 选题 论文撰写 投稿&#xff1a; 自己的实战经验&#xff1a; 选题 我是计算机专业&#xff0c;然后就是进行资料搜索 ei会议要求是 4-6页 &#xff0c;一般也就是2000字左右。 论文撰写 先写中文的 &#xff0c;写完之后再翻译成英文的&#xff0c;一般使用有道翻译…

iMeta高被引论文|西农焦硕/韦革宏等-干旱生态系统中土壤真菌与细菌群落构建的关系...

点击蓝字 关注我们 土壤真菌驱动细菌群落的构建 https://doi.org/10.1002/imt2.2 此文2月发表到11月&#xff0c;上线仅9个月&#xff0c;已经被引用了14次。 按2022年11月ESI高被引论文引用筛选阈值&#xff0c;本文为2022年微生物学、地学入选标准6次的2倍以上&#xff0c;妥…

什么是IEEE、EI、SCI?

在开组会的过程中&#xff0c;老师提到了一些我不熟悉的词汇&#xff0c;诸如globecom(一开始我还以为是globalcom呢)、WCNC等&#xff0c;我当时并不理解这些词汇的含义&#xff0c;觉得可能是某些期刊的简称&#xff0c;于是便搜索了下&#xff0c;在索搜过程中&#xff0c;我…

科研小白之SCI论文、EI论文和IEEE论文有什么区别?国内分区与SCI等的联系

总结(干货) SCI(Science Citation Index), 被Web of Science(http://apps.webofknowledge.com)收录的论文称为SCI论文&#xff1b;EI(Engineering Index), 被EI数据库收录的论文称为EI论文。目前EI数据库有三个版本&#xff1a;EiCompendex光盘数据库&#xff0c; EiCompendex…

查询论文SCI/EI检索及引用报告

一、查询论文是否被SCI检索 1.1打开网站 Clarivate 选择数据库&#xff1a;Web of Science核心合集 粘贴论文题目&#xff0c;选择主题&#xff0c;检索。 如果能出来检索结果&#xff0c;就说明论文能被SCI检索。如果不能&#xff0c;则论文没有SCI检索。 二、查询论文是…

论文中稿 IEEE ACCESS 期刊

奇迹很少发生&#xff0c;生活还需靠自己。 Amazing happens by accident, however, living flourishes with your own strength. 论文&#xff1a; FixCaps: An Improved Capsules Network for Diagnosis of Skin Cancer | IEEE Journals & Magazine | IEEE Xplore 代…

简谈SCI/EI学术论文写作与发表

SCI/EI学术论文写作发表 不论是研究生还是博士&#xff0c;还是想要有所追求的本科生&#xff0c;都希望能够能够把自己的研究成果记录下来分享。这里结合我最近一直在看的几本书&#xff0c;用简洁的中文语言和能听懂的人话&#xff0c;直接带来整个SCI、EI的写作框架。让你直…

科研论文中SCI,SSCI ,CSSCI是什么

目录 1 SCI 2 SSCI 3 CSSCI 什么是SCI&#xff0c;SSCI &#xff0c;CSSCI 目前&#xff0c;在国际科学界&#xff0c;如何正确评价基础科学研究成果已引起越来越广泛的关注。而被SCI、SSCI收录的科技论文的多寡则被看作衡量一个国家的基础科学研究水平、科技实力和科技论文…