使用egg写入文件

egg学习(一):使用egg的egg-mongoose搭建本地数据库 搭建一个egg项目: $ npm i egg-init -g $ egg-init egg-example --type=simple $ cd egg-example $ npm i 启动项目 $ npm run dev $ open localhost:7001 链接到本地的MongoDB: 安装mongoose并引入到项目中 npm install egg-mongoose -S 在... 阅读详情

一、简单介绍

1、安装
npm i await-stream-ready -S //异步进行读写操作
npm i stream-wormhole -S //在文件上传出现异常时能够把流消耗掉。
2、引入
const awaitWriteStream = require('await-stream-ready').write;
const sendToWormhole = require('stream-wormhole');
3、获取流
const stream = await ctx.getFileStream();
4、生成文件名
const filename = stream.filename; //可以自定义,这里直接使用上传的文件名
5、生成文件路径
const target = path.join('app/public/uploads', filename);//同样可以自己定义放在哪个文件夹,但是要是在public下面的子文件夹
6、生成文件写入文件流
const writeStream = fs.createWriteStream(target);
7、异步写入文件流
try {
  await awaitWriteStream(stream.pipe(writeStream));
} catch (err) {
  await sendToWormhole(stream);
  throw err;
}

二、项目实战

首先写一个基类

// controller/core/base.js文件夹下
const { Controller } = require('egg');
const fs = require('fs');
const path = require('path');
//异步二进制 写入流
const awaitWriteStream = require('await-stream-ready').write;
//管道读入一个虫洞
const sendToWormhole = require('stream-wormhole');
//时间格式化
const dayjs = require('dayjs');

class BaseController extends Controller {
    async uploadFile(category = '') {// category传过来的分开文件格式的目录
        //获取文件流
        const stream = await this.ctx.getFileStream();
        // 基础的目录
        const uploadBasePath = 'app/public/uploads';
        //生成文件名
        const filename = `${Date.now()}${Number.parseInt(Math.random() * 1000)}${path.extname(stream.filename).toLocaleLowerCase()}`;
        //生成文件夹
        const dirname = dayjs(Date.now()).format('YYYY/MM/DD');
        //创建目录
        function mkdirsSync(dirname) {
            if(fs.existsSync(dirname)) { //fs.existsSync检测目录是否存在,存在返回true,反之亦然
                return true;
            } else {
                if(mkdirsSync(path.dirname(dirname))) {//返回 path 的目录名,尾部的文件名会被忽略path.dirname('/目录1/目录2/目录3');返回'/目录1/目录2'
                    fs.mkdirSync(dirname);//fs.mkdirSync同步地创建目录
                    return true;
                }
            }
        }
        mkdirsSync(path.join(uploadBasePath, category, dirname));//path.join,以特定的分隔符将路径连接起来
        // 生成写入路径
        const target = path.join(uploadBasePath, category, dirname, filename);
        // 写入流
        const writeStream = fs.createWriteStream(target);
        try {
            //异步把文件流 写入
            await awaitWriteStream(stream.pipe(writeStream));
        } catch (err) {
            //如果出现错误,关闭管道
            await sendToWormhole(stream);
            return Promise.reject('上传错误')
        }
        return Promise.resolve({
            url: path.join('/public/uploads', category, dirname, filename),
            fields: stream.fields,
        });
    }
}

module.exports = BaseController;

其次在上传文件的控制器中使用

// controller/file/index.js文件夹下,文件夹可自定义

```javascript
'use strict';
const Controller = require('./../core/base');
class FileController extends Controller {
    //上传头像
    async headPortrait() {
        const { ctx } = this;
        // 上传头像的,会在uploads文件夹下有个headPortrait的文件夹下面才是时间文件夹
        try {
            const { url, fields } = await this.uploadFile('headPortrait');
            ctx.body = {
                code: 200,
                message: '上传成功',
                data: {
                    url,
                    fields
                }
            }
        } catch(err) { 
            ctx.body = {
                code: 500,
                message: err,
            }
        }
    }
}

module.exports = FileController;
egg获取上传文件 官方文档:egg获取上传文件 官方有俩种模式,file和stream,我用的是stream,简单示例: controller const Controller = require('egg').Controller const fs = require('fs') const path = require('path') class file extends Controller{ //... 阅读详情

相关推荐

egg项目使用swagger编辑api接口文档

下载swagger-ui 下载地址:swagger-ui github地址 可以直接download zip,下载到本地之后解压 配合egg项目使用 把解压好的swagger-ui目录下的dist目录中的文件都放到egg项目中/app/public/swagger 到这里下载一个json配置文件 点击file 点击转换json 然后把这个json文件下载之后放到egg项目中/app/pub...

microcosm1994的博客 1万+

java中Stream流

java中Stram流简介

小白有个大牛梦 867

使用egg.js和egg-sequelize连接MySql

(写得不对的地方,请多提宝贵意见) step1.使用egg.js快速初始化项目 $ npm i egg-init -g $ egg-init egg-example --type=simple $ cd egg-example $ npm i  不懂可以转至这里 https://eggjs.org/zh-cn/intro/quickstart.html   step2. 安装 egg-...

Cappuccino200的专栏 7251

v3+egg实现服务器向浏览器推送信息SSE

* egg代码**

m0_50884068的博客 903

在Egg中使用MongoDB及Mongoose

新公司的项目中用了Egg和MongoDB及mongoose。最近有空来系统的梳理一下。 参考资料&扩展阅读: Mongoose中文文档 mongoose学习笔记(超详细) Mongoose中文文档-Mongoose的API Egg链接MongoDB Egg 使用 egg-mongoose来方便的跟数据库进行链接 // eggProject/server/config/config....

Creabine的博客 2509

基于node.js的fs核心模块读写文件操作(实例讲解)

node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 – 同步和异步共存 ,有异步不用同步 – fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFile方法 – 文件大分流读取,stream – 引入fs模块 – let fs=require(‘fs’) 同步读取文件 -fs.readFileSync(‘路径’,utf8); let result=fs.readFileSync(‘./1.txt’,’utf8′); 异步读取文件,用参数err捕获错误 – fs.readFile(‘路径’,’utf8′,function(){}) fs.rea

EventSource+eggjs

最近看了chartGpt的请求,发现了EventSource的事件,之前没用过,所以学习下。请求过程中发现跨域了,然后配置了下允许跨域。eggjs 后端代码。

qq_38427709的博客 800

Docker+vLLM内网离线部署Qwen3 流程

本文介绍了在CentOS 7系统下进行VLLM容器化部署Qwen3-32B大模型的内网离线方案。首先需准备Nvidia显卡驱动、CUDA 12.4和Docker环境。通过联网机器拉取vllm/vllm-openai镜像并导入内网服务器,同时从魔塔社区下载模型文件。部署时使用docker run命令启动容器,配置了GPU资源、内存共享、端口映射等参数,特别指定了模型路径、并行计算、内存利用率等关键参数。该方案实现了大模型在内网环境的安全高效部署,适用于需要离线运行的AI推理场景。

qq_42881308的博客 1036

如何使用egg.js写文件上传后端代码

插件:egg-oss 安装:npm i egg-oss --save 文档:https://www.npmjs.com/package/egg-oss 配置:config/plugin.js oss: { enable: true, package: 'egg-oss', } 配置:config/config.default.js config.oss = { client: { accessKeyId: 'LTAI4DS1yG3E9z3dGijcqEvv',

weixin_46820017的博客 1400

SystemVue 链路预算、仿真分析步骤

使用SystemVue进行链路预算、频谱分析等,相对ADS更全面。

BeCourageable的博客 3836

复合材料热压罐固化残余应力仿真与优化

复合材料在热压罐固化过程中产生的残余应力是影响构件性能的关键因素,尤其在航空航天和风电叶片等高端制造领域。通过多物理场耦合仿真技术,可以精确预测残余应力分布,优化工艺参数。顺序耦合方法分步求解热分析和结构分析,既保证了计算精度,又控制了成本。Abaqus等有限元工具在此过程中发挥重要作用,通过合理设置边界条件、材料属性和接触关系,能够有效模拟温度场和应力场的相互作用。工程实践中,这种仿真方法已成功应用于无人机机翼、卫星支架等实际项目,显著降低了固化变形和微裂纹风险。

weixin_33146151的博客 216

egg使用ctx.getFileStream进行文件上传

stream = await ctx.getFileStream(); stream.filename :文件名称, stream.fields:附加字段 页面: formData.append('width', width) formData.append('height', height) formData.append('type', "1") formData.append('filename', file) formData.append(‘filename’, fi.

qq_36154659的博客 2755

详细教程:如何使用elasticsearch 8.x进行向量搜索

大模型的热度使得向量数据库和embedding也成了ai领域的热门话题,有别于从头开始训练一个大模型或基于基础模型进行微调的方式,embedding检索相关上下文是对大模型进行定制的各种方法中成本最低、技术实现最便捷的方式。从技术实现的角度,

qq_50790981的博客 1万+

前端UI框架:antd 上传文件;后端egg.js:接收文件并保存

后端代码:(egg.js) 'use strict'; const fs = require('fs') var path = require('path'); const Controller = require('egg').Controller; //故名思意 异步二进制 写入流 const awaitWriteStream = require('await-stream-rea...

若水程序员博客 1770

【系统分析师】第6章-基础知识:企业信息化(核心总结)

企业信息化是数字化转型的核心,涵盖战略规划、技术应用和实施路径等方面。关键内容包括ERP、CRM、SCM等系统的定义与实施,以及数据仓库、商业智能等技术的应用。备考系统分析师需掌握信息化战略规划方法(如BSP、SDP)、系统建模工具,并能分析解决信息孤岛等问题。论文可围绕ERP实施、数据仓库应用等主题展开。企业信息化面临组织变革、技术选型等挑战,但能显著提升运营效率和竞争力。

数据知道的博客 6933

Android Framework WMS全面概述和知识要点

WindowManagerService 类是整个 WMS 的核心大脑,处于系统服务层,负责协调和管理所有与窗口相关的操作。它在 Android 系统架构中起到承上启下的关键作用,向上对接应用层的窗口请求,向下与 SurfaceFlinger 等底层组件交互,确保窗口能够正确地在屏幕上显示和管理。

大模型大数据攻城狮的专栏 1794

【Egg】实现上传头像到本地服务器(单独一个图片文件)

Egg 实现上传文件到本地服务器 要理解当前代码,需要了解node.js 的 stream 工作原理,后续博客再分享~ 这里以base64转换为file文件类型的上传头像为例子 // 上传头像 async uploadAvatar() { const { ctx } = this; const stream = await ctx.getFileStream(); // 获取文件流 } console.log(stream) ???? const filename = Math.rand

Milk~每天分享一点点,技术进步一点点 1205

【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲

CH32V307的通用定时器模块包含一个16 位可自动重装的定时器(TIM2、TIM3、TIM4和TIM5),用于测量脉冲宽度或者产生特定频率的脉冲、PWM波等。可用于自动化控制、电源等领域。 输入捕获是通用定时器功能之一,一般用于测量频率和测量脉冲宽度。本文将详细介绍如何通用定时器的输入捕获功能。

视觉与物联智能 2814

在 Python 中安装 Egg 文件

早在 pip 时代之前,包就被存储为 .egg 文件,并通过 setuptools 组件进行安装。但是,由于 pip 已被引入 Python,.egg 已被 wheel 文件 .whl 取代。如果您正在使用其他软件包,则有可能与他们一起工作;虽然它们已被弃用,但您可以解决它们并安装存储为 .egg 文件的包。在本文中,我们将讨论如何在 Python 中安装 egg 文件,以及可用于实现此操作的工具。

迹忆客 9773

【论文解读--Xdog】新型电驱式四足机器人研制与测试

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人体型大小和驱动方式的比较二、四足机器人设计一些重要的结论三、系统控制框架四、系统硬件框架五、力位混合控制(阻抗控制)六、侧向平衡控制(和VMC如出一辙)七、电机驱动系统研制(FOC磁场定向控制)总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对新型电驱式四足机器人研制与测试做个简单的介绍,具体内容后续再更,其他模块可以参

qq_35635374的博客 3726

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

egg-jwt egg jwt 使用

1,安装egg-jwt npm install egg-jwt --save 2,配置 config/plugin.ts import { EggPlugin } from 'egg'; const plugin: EggPlugin = { jwt: { enable: true, package: "egg-jwt" }, }; export defau...

Yangliwei的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

electron-egg使用

本研究文档主要对使用electron-egg框架将vue项目打包为C/S包的过程、所遇问题及对应解决方案进行说明。

qq_45371023的博客 8281

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Egg 中使用 Mongoose 以及 Egg 中的 model

一、Egg 中的 model app/model/** 用于放置领域模型,可选,由领域类相关插件约定。 Loader : Egg 在 Koa 的基础上进行增强最重要的就是基于一定的约定,根据功能差异将代码 放到不同的目录下管理,对整体团队的开发成本提升有着明显的效果。Loader 实现了这约定,并抽象了很多底层 API 可以进一步扩展。 Loader 还提供了 caseStyle 强制指定首字母大...

Missing 3229

egg文件制作与安装

python的egg文件有点像java中的jar文件,是一个工程打包文件,便于安装部署,仅此一点,给多少pythoner带来了多少激动。 如何制作egg文件呢?see官方文档http://peak.telecommunity.com/DevCenter/PythonEggs, 到http://pypi.python.org/pypi/setuptools下载setuptools包,然后安装

BALANCE 3407

egg.js中使用egg-mysql操作mysql数据库

1、在 egg 项目中安装 egg-mysql npm i egg-mysql --save 2、在 {app_root}/config/plugin.js 中启用 egg-mysql 插件: 'use strict'; /** @type Egg.EggPlugin */ module.exports = { //mysql mysql:{ enable:t...

yzwdzkn的博客 1万+

Egg代理文件上传

遇到这个需求时候,疯狂百度搜索浏览几篇博客之后,看到解决方案大致分为两种: 代理上传流 先接收文件并写入,再代理请求上传 大多数文章都介绍的是第二种先接收文件并写入,再代理请求上传,这种方式无论是Egg自带的 HttpClient,还是superagent、request(已停止更新,不推荐使用)都是支持的。第一种代理上传流(单文件),目前只发现superagent支持(其他或许支持流,但需要先接收文件并写入)。接下来介绍解决方案。 先接收文件并写入,再代理请求上传 这种有很多种,本文只举例一个 依赖安

xiaojinglyd的博客 546
上一篇: MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
下一篇: 百度未授权使用地图API,可能是因为您提供的密钥不是有效的百度LBS开放平台密钥,或此密钥未对本应用的百度地图JavaScriptAPI授权。您可以访问如下网址了解如何获取有效的密钥:http://l
TE杨
博客等级 码龄7年 56粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值