Este proyecto debe incluir la carga de imágenes y la visualización de imágenes en la parte frontal. Para ello, practicaré cosas relacionadas con las imágenes por mí mismo. Es muy interesante, así que las compartiré.
Idea de implementación: el método de procesamiento del lado del servidor es guardar el archivo cargado por el front-end localmente en el lado del servidor, luego cambiar el nombre del archivo y luego almacenar la ruta de la imagen en el lado del servidor en la tabla. Cuando el front-end solicite la dirección de la imagen, vaya al lado del servidor para encontrar el archivo Y regrese a la pantalla frontal.
Cree un nuevo archivo common.js en la carpeta de rutas
//common.js
//导入所需模块
const router = require('koa-router')()
const api = require('../controllers/api')
const common = require('../util/comon')
const path = require('path')
const fs = require('fs')
const formidable = require('formidable')
const MimeLookup = require('mime-lookup')
const mime = new MimeLookup(require('mime-db'))
router.prefix('/common')
cargar imagen
//common.js
//上传图片
router.post('/addUploadImg', async (ctx, next) => {
console.log(ctx.req)
let form = new formidable.IncomingForm()
form.hash = "md5"
form.multiples = false //默认只能上传一个文件,更多form的配置参考node-formidable
form.maxFileSize = 2 * 1024 * 1024 //设置文件最大不超过2M
let type = ['image/png','image/gif','image/jpg','image/jpeg','image/webp']//支持上传的图片类型
function formImage() {
return new Promise((resolve, reject) => {
form.parse(ctx.req, async function (err, fields, files) {
//注意:跟express有差异,这里要传入ctx.req
let file = files['file']
if (file) {
let flag = await common.checkFile(file.type, file.size) //校验文件的大小和类型
console.log('校验通过'+flag)
if (flag) {
//文件校验通过
const oldpath = file['_writeStream'].path //系统缓存上传的文件地址
const dir = path.join(__dirname, `../common/upload/img`)
const fileFormat = file.name.split('.')
file.name = `${
file.hash}_${
Date.now()}.${
fileFormat[fileFormat.length - 1]}` //通过file.hash加时间戳生成文件名
const newpath = `common/upload/img/${
file.name}`
if (!fs.existsSync(dir)) {
//先判断文件夹名是否存在,不存在则生成根据XXX生成对应的文件夹
fs.mkdirSync(dir)
}
//如果是非WINDOWS系统,可以用fs.renameSync()来实现,这里为了兼容用了node的pipe来实现
let readStream = fs.createReadStream(oldpath)
let writeStream = fs.createWriteStream(newpath)
readStream.pipe(writeStream) //这里文件已经上传成功
resolve(ctx.origin + "/" + newpath) //返回完整的文件地址
} else {
reject(null)
}
} else {
reject(null)
}
})
})
}
await formImage()
.then(res => {
ctx.body = {
code: 200,
status: 200,
data: res,
message:'上传成功'
}
}).catch(err => {
ctx.body = {
code: 400,
status: 200,
data: {
},
message:'上传失败'
}
}
)
})
Descargar imagen
//common.js
//显示图片
router.get('/upload/img/:imgUrl', async (ctx, next) => {
url=ctx.url
let index = url.lastIndexOf('/')
imgUrl = url.substring(index + 1, url.length)
let filePath = path.join(__dirname, `../common/upload/img/${
imgUrl}`)
file = fs.readFileSync(filePath)//读取文件
// console.log(await watermark.addWatermark(file, options))
let mimeType = mime.lookup(filePath) //读取图片文件类型
ctx.set('content-type', mimeType) //设置返回类型
ctx.body = file //返回图片
})
La descarga aquí significa que el front-end obtiene el enlace de la imagen y directamente img src = "https: //***/upload/img.123sdjfhg.png" cuando el servidor realmente necesita responder a esta solicitud de dirección desde el front-end, lo anterior es el recibo Después de la solicitud, vaya al servidor para obtener la imagen y léala, y luego devuelva el archivo a la interfaz. Suponiendo que se puede realizar la verificación del token para solicitar la API, se recomienda poner la ruta de la interfaz "/ common / upload /" en la lista blanca (sin token).
Estructura de archivo
La estructura final presentada en el proyecto es: Hasta
ahora, se han completado los requisitos para cargar y descargar imágenes de front-end. ¡Gracias por mirar!
Anterior: Use swagger para generar automáticamente documentos de interfaz
Anterior: Genere registros de solicitudes