关于文件上传的前后端优化

此前做过单文件、多文件上传和大文件分片上传,虽然功能有了,效果也还可以。不过最近重新思考一下,突然注意到一个重要的事情,大文件上传中,系统做了很多无用功,导致效率太低!
怎么说呢?是这样的,大文件上传,我前端采用的是百度的webuploader,后端用nodejs+express+multer。webuploader在前端分片上传,我是分片存为临时文件,全部传完后,前端发消息到后端执行分片合并,表面上没有毛病,其实我完全是被webuploader给忽悠瘸了,因为分片合并根本就不是必要的!
multer支持将formdata传来的文件存为硬盘文件,其实也可以缓存在memoryStorage ,我们可以直接写入目标文件的特定位置,根本不必要将分片写入临时文件,再在完成所有分片时将临时文件读取写入到目标文件。假设读写一个分片的开销都是1,那么写入分片读取分片写入目标的开销就是3了,而实际上我们直接写入目标就可以了,代价是1,相当于我们的效率只有1/3,做了2/3的无用功。
后来又查了一下,有反映说multer在高版本不再支持memoryStorage了,可以直接getStream,也好,反正我是需要pipeline装配这个stream的。

const multer = require('multer');
const getStream = require('get-stream');
...
app.post('/upload_chunks', multer().array('file'), (req, res, next)=> {let obj= req.body;let dest_dir = jargs.destDir+"/"+obj.reqid;let dest_path = dest_dir+"/"+ obj.name;let chunkid = (obj.chunk)?Number(obj.chunk):0;let start = chunkid * jargs.chunkSize;pipeline( getStream(req.files[0].stream), fs.createWriteStream(dest_path, { flags:'r+', start:start }), (err) => { if (err) { return res.json({'status': 0}); } res.json({'status': 1}); });
});app.post('/createfile', (req, res) => {let dest_dir = jargs.destDir+"/"+req.body.reqid;fs.mkdir(dest_dir, { recursive: true }, (err) => {if (err) { logger.error("目录创建出错"); res.json({'status': 0}); }else {let dest_path = dest_dir+"/"+ req.body.filename;logger.info("创建目标文件 "+dest_path);fs.writeFile(dest_path, '', (error) => { if (error) { logger.error("创建文件失败"); res.json({'status': 0}); } else {res.json({ 'status': 1 });}});}});
});

后端有两个接口,一个是分片上传,另一个是创建目标文件,要在分片上传前执行,前端是webuploader的话,就在fileQueued里调用执行。
更改后,前后段代码一下子减少了一大半,没有分片合并了,没有合并进度查询了,对服务器空间占用需求也减少了,速度还大幅度提升了。。。

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

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

相关文章

JAVA高阶私房菜:JVM虚拟机核心概念及参数微调实验

目录 基础快速掌握 什么是JVM虚拟机 JVM的的实现 操作系统-虚拟机-JRE-JDK的关系 生产环境部署JDK还是JRE JVM内存组成部分和堆空间分布 内存组成 堆空间内存分布 内存分布 堆空间分配 JVM堆空间垃圾回收流程及JVM参数 垃圾回收流程 JVM参数分类 JVM参数格式分类 …

浅识数据结构之时间复杂度

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 文章目录 前言一. 时间复杂度1.1 时间复杂度的概念1.2 时间复杂度如何计算1.3 时间复杂度如何表…

XSS-跨站脚本攻击 漏洞详解

一、初识XSS 1、什么是XSS XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动…

【已解决简单好用】notepad++怎么设置中文

打开Notepad软件。点击软件界面顶部菜单栏中的“Settings”选项。在下拉菜单中选择“Preferences”进行语言设置。在打开的设置窗口中,找到“General”选项。在“General”选项中,找到“Localization”(界面语言)项。在下拉菜单中…

Modern CSV for Mac:强大的CSV文件编辑器

Modern CSV for Mac是一款功能强大的CSV文件编辑器,专为Mac用户设计,提供直观易用的界面和丰富的功能,使用户能够轻松编辑和管理CSV文件。 Modern CSV for Mac v2.0.6激活版下载 这款软件支持快速导入和导出CSV文件,方便用户与其他…

【Hadoop】- MapReduce YARN的部署[8]

目录 一、部署说明 二、集群规划 三、MapReduce配置文件 四、YARN配置文件 五、分发配置文件 六、集群启动命令 七、查看YARN的WEB UI 页面 一、部署说明 Hadoop HDFS分布式文件系统,我们会启动: NameNode进程作为管理节点DataNode进程作为工作节…

大数据Hive中的UDF:自定义数据处理的利器(上)

文章目录 1. 前言2. UDF与宏及静态表的对比3. 深入理解UDF4. 实现自定义UDF 1. 前言 在大数据技术栈中,Apache Hive 扮演着数据仓库的关键角色,它提供了丰富的数据操作功能,并通过类似于 SQL 的 HiveQL 语言简化了对 Hadoop 数据的处理。然而…

flutter(学习日记篇-1)

windows配置开发环境等 1.下载sdk---------flutter官网 2.配置环境变量 ①在系统中找到环境变量的配置位置,在用户变量模块中选中变量为path的项进行编辑(没有path就新建),然后找到刚才下载的flutter的位置,点击目录…

综合案例(前端代码练习):猜数字和表白墙

目录 一、猜数字 html代码: 点击 猜 按钮的js代码: 点击 重开游戏 按钮的js代码: 整体代码: 页面效果: 二、留言板 css代码: html代码: js代码(主逻辑在这)&am…

前端进阶特训营-TDD制造rollup-0

11月22日 然叔(夏然)带着大家写rollup, 全部采用TDD方式开发。 rollup是什么?就是一个打包器。 rollup适合类库场景,工程上使用webpack. mini-rollup项目分为6部分 1.原型 Treeshaking,AST 2.节点遍历器 Walk 3.构造作用域 Scope 4.模块分析函数 analyz…

无损以太网的ROCE革命,队列的缓存空间优化分析

ROCE无损以太网,队列的缓存空间优化 多级缓存架构优化芯片性能:* 缓存空间细分为芯片级、端口级和队列级,实现精细管理。* 无损队列引入Headroom缓存空间,确保数据完整性。 在芯片层面: 静态缓存为端口提供保证的缓存空…

欧鹏RHCE 第三次作业

unit3.远程连接服务实战 作业题目: 1. 一.配置两台主机 主机1. 主机名: server.example.com ip: 172.25.254.100 建立用户timinglee,其密码为timinglee 主机2 主机名:client.example.com ip: 172.25.254.200 2.安需求完成项目 172.25.254.200 在远程…

2024.4.19作业

1.总结二进制信号量和计数型信号量的区别,以及他们的使用场景。 二进制信号量只有0和1两个状态,如果信号被一个线程接收,那别的线程就无法接收此信号 计数型信号可以累计,可以被多个线程接收 2.使用计数型信号量完成生产者和消费…

【深度学习实战(11)】搭建自己的dataset和dataloader

一、dataset和dataloader要点说明 在我们搭建自己的网络时,往往需要定义自己的dataset和dataloader,将图像和标签数据送入模型。 (1)在我们定义dataset时,需要继承torch.utils.data.dataset,再重写三个方法…

ModuleNotFoundError: No module named ‘scripts.animatediff_mm‘ 解决方案

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文主要介绍在使用 Stable Diffusion WebUI 安装 AnimateDiff 插件后出现的ModuleNotFoundError: No module named scripts.animatediff_mm异常的解决方案,希望…

第三方应用类---Phpmyadmin 后台 Getshell 操作

免责声明:本节仅做技术交流学习. 目录 什么是Phpmyadmin? getshell前提条件: 详细步骤: 1-搜集到开放phpmyadmin的web,然后访问进去 2-执行SQL命令查看是否开启了读写权限 3-开启了读写权限-->继续 没有开读写权限--->鸡鸡 4-有读写权限之后,执行SQL语句导出文件…

关于edge浏览器点击下载后没有反应的问题解决

不知道什么时候开始,edge浏览器点击下载后没有反应了。 根据网上教程,关闭smartscreen的方式试了没用 后来偶然发现,是因为在扩展里,有一个迅雷下载的扩展,关闭后,就可以正常下载了 具体如下&#xff1a…

Java,Python和Go语言语法差异对比

前段时间一直在找工作,比较颓废,很长时间都没有更新博客了,最近公司的项目需要用到Python语言和Go语言, 所以又重新学习了一下Python语言和Go语言,现在做一些总结,方便以后复习使用,同时也给其他…

扩散卷积模型 笔记

1 Title Diffusion Convolutional Neural Networks(James Atwood and Don Towsley)【NeurIPS 2016】 2 Conclusion This paper presents diffusion-convolutional neural networks (DCNNs), a new model for graph-structured data. Through the introd…

使用docker搭建GitLab个人开发项目私服

一、安装docker 1.更新系统 dnf update # 最后出现这个标识就说明更新系统成功 Complete!2.添加docker源 dnf config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo # 最后出现这个标识就说明添加成功 Adding repo from: https://download.…