前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Egg上传图片与使用 Jimp 生成缩略图

Egg上传图片与使用 Jimp 生成缩略图

作者头像
越陌度阡
发布于 2020-11-26 02:47:06
发布于 2020-11-26 02:47:06
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

1. 定义模板文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form action="/admin/focus/doAdd?_csrf=<%=csrf%>" method="post" enctype="multipart/form-data">
    <ul>
        <li> 分类:<select name="type" id="type" style="width:300px;height:26px">
                <option value="1">网站</option>
                <option value="2">APP</option>
                <option value="3">小程序</option>
            </select>
        </li>
        <li>名称:<input type="text" name="title" style="width:300px;height:26px" /></li>
        <li>链接:<input type="text" name="link" style="width:300px;height:26px" /></li>
        <li>上传:<input type="file" name="focus_img" style="width:300px;height:26px;" /></li>
        <li>排序:<input type="text" name="sort" value="1000" style="width:300px;height:26px" /></li>
        
        <li style="display:flex;flex-direction:row;"> 
            状态:     
            <input type="radio" name="status" checked value="1" id="a" style="margin-right:10px" ; />
            <label for="a" style="margin-right:10px">显示</label>
            <input type="radio" name="status" value="0" id="b" style="margin-right:10px" />
            <label for="b" style="margin-right:10px">隐藏</label>   
        </li>

        <li>
            <button type="submit" class="btn btn-primary">提交</button>
        </li>
    </ul>
</form>

2. 定义上传图片数据库的model

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// app/model/focus.js

module.exports = app => {
    const mongoose = app.mongoose;
    const Schema = mongoose.Schema;
    // 配置轮播图和Schema
    const now = (new Date()).getTime();
    const FocusSchema = new Schema({
        title: { type: String },
        type: { type: Number },
        focus_img: { type: String },
        link: { type: String },
        sort: { type: Number },
        status: { type: Number, default: 1 },
        add_time: {
            type: Number,
            default: now
        }
    });

    return mongoose.model('Focus', FocusSchema, 'focus');
}

3. 配置上传路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// router.js

'use strict';
module.exports = app => {
    const { router, controller } = app;
    router.post('/admin/focus/doAdd',controller.admin.focus.doAdd);
};

4. 配置上传地址、格式及大小设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// config/config.default.js
'use strict';
module.exports = appInfo => {

    const config = exports = {};
    // use for cookie sign key, should change to your own and keep security
    config.keys = appInfo.name + '_1585450669767_9677';


    // 上传文件存放的全局地址
    config.uploadDir = 'app/public/admin/upload';

    // 上传文件的配置
    // https://github.com/eggjs/egg-multipart
    config.multipart = {
        // 允许上传的图片格式
        whitelist:['.png','.jpg','.jpeg'],
        // 文件允许大小
        fileSize:'50mb'
    }

    // 配置两种模板引擎(参考官方文档)
    config.view = {
        mapping: {
            '.html': 'ejs',
            '.nj': 'nunjucks'
        }
    }

    return config

};

5. 定义控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// app/controller/admin/focus.js

'use strict';
const Fs = require('fs');
// cnpm i mz-modules --save
// 此模块解决上传卡死
const Pump = require('mz-modules/pump');

const Controller = require('egg').Controller;

class FocusController extends Controller {

    // 添加轮播图提交
    async doAdd() {
        // autoFields: true 表示除了文件的其它字段
        let parts = this.ctx.multipart({ autoFields: true });
        let files = {}, stream;
        // 循环获取数据流
        while ((stream = await parts()) != null) {
            if (!stream.filename) {
                // 多文件上传时,只能break,不能return
                break;
            }
            // 文件表单的name
            let fieldname = stream.fieldname;

            // 获取上传文件路径与入库保存路径
            let dir = await this.service.tools.getUploadFile(stream.filename);
            // 上传路径
            let target = dir.uploadDir;

            // 写入上传文件
            let writeStream = Fs.createWriteStream(target);
            await Pump(stream, writeStream);

            // 将多个上传图片统一拼接为一个对象,便于访问
            files = Object.assign(files, {
                [fieldname]: dir.saveDir
            })

            // 生成缩略图 target为图片地址
            this.service.tools.jimpImg(target);
        }

        // 将上传的图片与提交的其它字段合并
        let focus = new this.ctx.model.Focus(Object.assign(files, parts.field));
        let result = await focus.save();

        // 对result做出结果判断(略)
        
        this.ctx.body={
            "message":"上传图片成功",
            "success":true
        }
    }

}
module.exports = FocusController;

6. 在控制器中需要调用的服务中的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// app/service/tools.js

'use strict';
const Path = require('path');
const Service = require('egg').Service;


// 引入格式化时间模块
// cnpm i silly-datetime --save
const Sd = require('silly-datetime');

// 引入模块智能生成上传文件夹
// cnpm i mz-modules --save
const Mkdirp = require('mz-modules/mkdirp');


// 引入生成缩略图的模块
// cnpm install jimp --save
// https://github.com/oliver-moran/jimp/tree/master/packages/jimp
const Jimp = require('jimp');


class ToolService extends Service {

    // 获取当前时间戳
    async getTime(){
        let now = new Date();
        return now.getTime();
    }

    // 处理要上传的文件名
    async getUploadFile(filename){
        // 获取当前日期
        let now = Sd.format(new Date(),'YYYYMMDD');
        // 创建文件目录(将存放地址与日期进行拼接);
        let dir = Path.join(this.config.uploadDir,now);
        // 按dir去创建文件夹,如果没有则生成,如果有则忽略
        await Mkdirp(dir);

        // 以时间戳命名文件
        let timestamp = await this.getTime();

        // 图片的保存路径(文件夹 + 时间戳 + 后辍名)
        let uploadDir = Path.join(dir,timestamp + Path.extname(filename));

        return{
            // 上传的地址
            uploadDir:uploadDir,
            // 保存在数据库的地址
            saveDir:uploadDir.slice(3).replace(/\\/g,'/')
        }
    }


    // 生成缩略图方法
    async jimpImg(target){
        Jimp.read(target, (err, lenna) => {
            if (err) throw err;
            // 生成200乘以200大小,品质为90,并重命名文件
            lenna.resize(200,200).quality(90).write(target+'_200x200'+Path.extname(target)); 
        })

    }

}

module.exports = ToolService;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Egg中使用DiyUpload实现图片批量上传
2. 在HTML文件中定义一个标签,指定插件要加载的位置,另外定义一个隐藏表单域,用于上传成功后保存返回的地址。
越陌度阡
2020/11/26
1.3K0
Egg中使用DiyUpload实现图片批量上传
Egg中使用 wysiwyg-editor 编辑器
https://www.froala.com/wysiwyg-editor/docs/options
越陌度阡
2020/11/26
9750
Egg中上传单文件与多文件
1. 单文件上传 1. 模板文件 <!-- csrf为egg所提供的安全机制,需要在模板文件上绑定--> <form action="/admin/upload/singleUpload?_csrf=
越陌度阡
2020/11/26
1.7K0
Egg 中结合Mongoose操作Mongodb
1. 安装模块 npm i egg-mongoose --save 2. 配置 egg-mongoose 插件 // config/plugin.js 'use strict'; exports.ejs = { enable: true, package: 'egg-view-ejs', }; // 配置egg-mongoose插件 exports.mongoose = { enable: true, package: 'egg-mongoose' }; 3. 配置连接数据库
越陌度阡
2020/11/26
2.2K0
Egg 中间件使用详解
1. 在 middleware 文件夹中定义中间件文件,如 auth.js,并实现自定义的功能。
越陌度阡
2020/11/26
1.9K0
antdesign + koa 实现图片上传
我们今天实现一下图片上传,前端用到的是antdesign中的文件上传,后端是自己封装的node的koa框架。
用户4793865
2023/01/12
8890
Koa2+MongoDB+JWT实战--Restful API最佳实践
Web API 已经在最近几年变成重要的话题,一个干净的 API 设计对于后端系统是非常重要的。
前端森林
2020/04/23
9.4K0
Koa2+MongoDB+JWT实战--Restful API最佳实践
asp.net上传图片并生成缩略图
<script language="VB" runat="server"> Sub UploadFile(sender As Object, e As EventArgs)
Java架构师必看
2021/03/22
2.3K0
node实现静态资源的上传发布
需求是这样的:**产品通过axure生成导出的html页面发给开发的时候需要安装插件,很不方便,为方便大家的协同,决定开发一个简单的协同共享工具,实现导出html页面的打包上传,并发布生成可访问的url。**本文将讲述在node环境下如何实现上述的需求。
牛老师讲GIS
2022/05/10
6730
node实现静态资源的上传发布
Vue + Node.js 搭建「文件上传」管理后台
本教程手把手带领大家搭建一套通过 Vue + Node.js 上传文件的后台系统,只要你跟随本教程一步步走,一定能很好的理解整个前后端上传文件的代码逻辑。前端我们使用 Vue + Axios + Multipart 来搭建前端上传文件应用,后端我们使用 Node.js + Express + Multer 来搭建后端上传文件处理应用。
蒋川
2022/04/22
12.2K0
Vue + Node.js 搭建「文件上传」管理后台
使用 Egg + Vue 开发在线文档管理平台(8000字,手把手教程)
团队中会遇到在线文档管理的需求,包括技术文档,接口文档, excel 文档,和产品原型的托管等需求,一直没有找到合适的开源项目来满足需求,所以动手实现了个文档管理系统(实现起来并不复杂,该教程只是提供思路,并非最佳实践)
一只图雀
2020/12/16
4K0
使用 Egg + Vue 开发在线文档管理平台(8000字,手把手教程)
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源
视频地址:https://www.cctalk.com/v/15114923882788 处理静态资源 无非花开花落,静静。 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并使用 安装 koa-static: npm i koa-static -S 修改 app.js,增加并指定 /public 目录为静态资源目录。 const Koa = require('koa') const path = require('path') const bodyParser = r
iKcamp
2018/03/30
1.1K0
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源
Egg.js 试水 - 天气预报
官网介绍,Egg奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本。
Jimmy_is_jimmy
2020/10/15
1.3K0
案例:学生档案管理
const template = require('art-template');
Qwe7
2022/05/24
8930
Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5
想必你一定使用过易企秀或百度H5等微场景生成工具制作过炫酷的h5页面,除了感叹其神奇之处有没有想过其实现方式呢?本文从零开始实现一个H5编辑器项目完整设计思路和主要实现步骤,并开源前后端代码。有需要的小伙伴可以按照该教程从零实现自己的H5编辑器。(实现起来并不复杂,该教程只是提供思路,并非最佳实践)
Nealyang
2019/11/14
5.6K1
Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5
基于 nodejs 爬取大学城用户信息
nodejs + cheerio + request-promise + mongoose
4O4
2022/04/25
5010
基于 nodejs 爬取大学城用户信息
React + Node.js 全栈实战教程 - 手把手教你搭建「文件上传」管理后台
本教程手把手带领大家搭建一套通过 React + Node.js + Mongodb 上传文件的后台系统,只要你跟随本教程一步步走,一定能很好的理解整个前后端上传文件的代码逻辑。前端我们使用 Reactjs + Axios 来搭建前端上传文件应用,后端我们使用 Node.js + Express + Multer + Mongodb 来搭建后端上传文件处理应用。
蒋川@卡拉云
2022/07/11
15.6K0
React + Node.js 全栈实战教程 - 手把手教你搭建「文件上传」管理后台
学习 | egg.js 从入门到精通
[wp_editor_md_976949143a4a48533829d49a6bdde651.jpg]
mySoul
2020/07/19
1.4K0
nodejs微信公众号开发
网上关于node开发公众号的资料相当缺乏,本文旨在以node的视角对公众号开发做一个阐述。
一粒小麦
2019/08/06
6.3K4
Node.js 开发实践,前端工程师的 MVP 利器
本文经作者授权转载至公众号 “Nodejs技术栈”,作者:愚坤,掘金优秀作者,一名没上高中的前端工程师,目前就职水滴筹。 什么是 MVP,来自伟大的百科: Minimum Viable Product –最简化可实行产品。 是指以最低成本尽可能展现核心概念的产品策略,即是指用最快、最简明的方式建立一个可用的产品原型,这个原型要表达出你产品最终想要的效果,然后通过迭代来完善细节。该术语由弗兰克·罗宾逊和埃里克·里斯推广于Web应用程序 ,它也可能涉及到进行市场前手的分析。 前言: Node是前端工程师的贵人,
五月君
2020/11/30
9230
Node.js 开发实践,前端工程师的 MVP 利器
相关推荐
Egg中使用DiyUpload实现图片批量上传
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档