图片上传实现代码
简单了解一下node
的fs
模块。
- fs.createReadStream(path[, options])
返回ReadStream 对象。 - fs.createWriteStream(path[, options])
返回 WriteStream 对象。 - fs.mkdir(path[, options], callback) 创建目录
- fs.existsSync(path) 检测给定的路径是否存在。
实现图片上传的思路:
利用stream流来读取文件。流
是一种抽象的概念,它表示的含义是文件的传输,就像水流一样,通过管道
一点一点的传向目的地。流的背后是一个又一个的缓冲区
,提前为数据做好了准备。
// 获取文件数据
const file = ctx.request.files.file
// 获取文件名
const basename = path.basename(file.path)
// 创建读取流
const fileReader = fs.createReadStream(file.path)
// 文件上传路径
const filePath = path.join(__dirname.substring(0, __dirname.indexOf('dist') + 4), 'public/uploads')
const fileResource = filePath + "/" + basename
// 创建输入流
const writeStream = fs.createWriteStream(fileResource, {
flag: 'w'
})
// 输入路径不存在则创建
if (!fs.existsSync(filePath)) {
fs.mkdir(filePath, (err: any) => {
if (err) {
throw new Error(err)
}
})
}
// 打通读取流和输入流之间的通道,开始数据传输
fileReader.pipe(writeStream)
图片压缩 images库
由于项目需要用户上传大量图片并显示出来,为了加快渲染速度,因此需要对用户传入的图片进行压缩处理。使用images库,轻量使用简单。
if (file.size > 1040000) {
//图片大于1m进行压缩处理
images(file.path) //Load image from file
//加载图像文件
.size(400) //Geometric scaling the image to 400 pixels width
.save(fileResource, {
quality: 100
});
} else{
images(file.path) //Load image from file
.save(fileResource,{
quality: 100
})
}
这个包压缩的图片质量有size和quality一起决定,一般压缩后展示效果不佳