课程名称:web前端架构师
课程章节:第17周 第二章 文件上传基本原理实现以及使用sharp 完成图片处理
主讲老师:张轩
课程内容:sharp 完成图片缩放处理
之前我们完成了图片的上传的功能,但是当我们上传的图片很大时,需要使用缩略图
我们可以使用 sharp 来帮助我们来处理图片。sharp 官网地址 https://sharp.pixelplumbing.com/
npm i sharp
设置图片的宽度 https://sharp.pixelplumbing.com/api-resize
sharp(input) .resize({ width: 100 })
public async upload() { const { ctx, app } = this; const file = ctx.request.files[0]; const url = file.filepath.replace(app.config.baseDir, app.config.baseURL); // 生成缩略图 const image = sharp(file.filepath); const metaData = await image.metadata(); let thumbnailUrl = ''; // 缩略图地址 if (metaData.width && metaData.width > 300) { const { name, ext, dir } = path.parse(file.filepath); // 设置缩略图的路径 const thumbnailPath = path.join(dir, `${name}-thumbnail.${ext}`); await image.resize({ width: 300 }).toFile(thumbnailPath); thumbnailUrl = thumbnailPath.replace(app.config.baseDir, app.config.baseURL); } ctx.helper.success({ ctx, res: { url, thumbnailUrl: thumbnailUrl ? thumbnailUrl : url, } }); }
Stream 的官方文档:https://nodejs.org/api/stream.html
流是 Node.js 中最好,也是最容易误解的概念
流就是数据的合集,数据可以是字符串也可以是数组,流的数据不是一次性全部获得的
import fs from 'fs' // 一次性读取文件的所有内容 fs.readFile('./1.log') // 一边读一遍输出 fs.createReadStream('./1.log')
流的类型
我们要一个文件的内容写入到另一个文件中
import fs from 'fs' const readStream = fs.createReadStream('./old.log') const writeStream = fs.createWriteStream('./new.log') readStream.pipe(writeStream)
如果我们使用过 gulp, 就会将成使用 pipe 这个方法
流基于 EventEmitter,常见的事件有
其实之前的 pipe 就相当于
readStream.on('data', chunk => { writeStream.write(chunk) }) readStream.on('end', () => { writeStream.end() })