[Registro 6] Vue + nodo + koa2 + mysql + nginx + redis, desarrollo de pila completa de pequeños programas y sistema de gestión de administradores proyectos-carga y descarga de imágenes del lado del servidor

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
Inserte la descripción de la imagen aquí
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

Supongo que te gusta

Origin blog.csdn.net/Smell_rookie/article/details/108886254
Recomendado
Clasificación