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

这篇具有很好参考价值的文章主要介绍了SpringBoot:使用application/octet-stream 流式上传大文件,解决Mutipartfile multipart/form-data上传产生临时文件问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

multipart原理简介

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

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

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

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

这里面的流是从DiskFileItem(一眼磁盘)拿的,还告诉了你临时目录位置location
java multipartfile 临时文件,Web容器,Spring,spring boot,java,servlet

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 TEMPDIR
                location = 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里给就可以解决这个问题文章来源地址https://www.toymoban.com/news/detail-622844.html

    @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";
        }
    }

到了这里,关于SpringBoot:使用application/octet-stream 流式上传大文件,解决Mutipartfile multipart/form-data上传产生临时文件问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 跨域情况下,vue如何下载后台接口提供的application/octet-stream文件流Excel文件

    由于跨域,所以无法直接通过window.location.href或者a标签直接下载,直接拼后台接口地址又暴露了后台地址,不可行。 所以在这种跨域情况下,本章讲一下vue如何下载后台接口提供的application/octet-stream文件流Excel文件。 实现前端vue下载后台返回的application/octet-stream文件流 1、使

    2024年02月14日
    浏览(43)
  • 为什么通过EasyExcel下载 Excel 文件时,response.setContentType(“application/octet-stream“) 这样设置,下载下来的文件不能显示文件名称?

    response.setContentType(\\\"application/octet-stream\\\") 是用来告诉浏览器服务器返回的数据是二进制流,因为 octet-stream 意味着 \\\"一个未知的字节流\\\"。当浏览器收到这个响应时,它无法确定数据类型,所以它的解析方式会尝试将这些未知字节自动转换为可读的格式。 当您使用 EasyExcel 将数据

    2024年02月13日
    浏览(51)
  • Java实现方法接口入参同时包含文件、字段和对象等多种类型。HTTP请求返回415状态,Content type ‘application/octet-stream‘ not supported错误。

    方法一:对象不使用注解 使用Postman测试,直接将subject对象的字段填在key的位置 方法二:对象使用注解@RequestPart 使用Postman测试,将字段包装在subject对象里,使用Content type:application/json的内容类型 注:方法二在开发本地测试执行成功,但是在测试人员机子下不通过,执行报

    2024年02月12日
    浏览(41)
  • 在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算

    引言: 在当今大数据时代,实时数据处理和流式计算变得越来越重要。Apache Spark作为一个强大的大数据处理框架,提供了Spark Streaming模块,使得实时数据处理变得更加简单和高效。本文将深入浅出地介绍如何在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算,并提供

    2024年03月27日
    浏览(48)
  • Kafka Stream 流式计算

    1.1 概念 一般流式计算会与批量计算相比较。在流式计算模型中,输入是持续的,可以认为在时间上是无界的,也就意味着,永远拿不到全量数据去做计算。同时,计算结果是持续输出的,也即计算结果在时间上也是无界的。流式计算一般对实时性要求较高,同时一般是先定

    2024年01月23日
    浏览(41)
  • ChatGPT流式传输(stream=True)的实现-OpenAI API 流式传输

    默认情况下,当请求OpenAI的API时,整个响应将在生成后一次性发送回来。如果需要的响应比较复杂,就会需要很长时间来等待响应。 为了更快地获得响应,可以在请求API时选择“流式传输”。 要使用流式传输,调用API时设置 stream=True 。这将返回一个对象,以 data-only server-

    2024年02月08日
    浏览(72)
  • Stream流式编程,让代码变优雅

    一、引言 流式编程的概念和作用 Java 流(Stream)是一连串的元素序列,可以进行各种操作以实现数据的转换和处理。流式编程的概念基于函数式编程的思想,旨在简化代码,提高可读性和可维护性。 Java Stream 的主要作用有以下几个方面: 简化集合操作:使用传统的 for 循环或迭

    2024年02月05日
    浏览(42)
  • Java新特性:Stream流式编程

    Java新特性:Stream流式编程 Stream 流是 Java8 提供的新功能,是对集合对象功能的增强,能对集合对象进行各种非常便利、高效的聚合操作,或大批量数据操作。Stream 流以一种声明性方式处理数据集合,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理

    2024年02月15日
    浏览(44)
  • Java 8:Stream API 流式操作

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Java 8 中的 Stream API 是一组用于对集合数据进行处理的新特性;提供一种以声明式风格对集合进行操作的方式,简化集合的处理,使得代码更加简洁、优雅,并且能够更高效地处理数据; 这种风格将要处理的元素集合看

    2024年02月13日
    浏览(43)
  • axios / fetch 实现 stream 流式请求

    axios 是一个支持node端和浏览器端的易用、简洁且高效的http库。本文主要介绍 axios 如何实现 stream 流式请求,注意这里需要区分 node 环境和浏览器环境。 代码演示: 在浏览器端,axios 是使用 XMLHttpRequest 对象来实现请求,设置 responseType: \\\'stream\\\' 后会出现以下警告⚠️: The pr

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包