thumbs.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. var express = require('express');
  2. var router = express.Router();
  3. const fs = require('fs');
  4. var path = require('path');
  5. const createError = require('http-errors');
  6. const config = require('../../config/app');
  7. const { makeThumb } = require('../../libs/image');
  8. router.get(/^\/(tag|avatar)\/(128|256|512|480|320|640|720)\/([a-zA-Z0-9_]+).(png|jpg|jpeg|webp)$/, function (req, res, next) {
  9. (async function () {
  10. let params = Object.values(req.params);
  11. let [type, size, id, ext] = params;
  12. var staticRoot = config.STATIC_DIR;
  13. var thumbFilePath = path.resolve(staticRoot, 'thumbs/v1', [type, size, id].join('/')) + '.' + ext;
  14. var originalFilePath = path.resolve(staticRoot, 'thumbs/v1', [type, 'original', id].join('/')) + '.' + ext;
  15. let exists = fs.existsSync(originalFilePath);
  16. let dir;
  17. if (!exists) {
  18. let data;
  19. if (type == 'avatar') {
  20. try {
  21. data = fs.readFileSync(__dirname + `/../../dist/assets/avatar/${id}.jpeg`);
  22. } catch (e) {
  23. if (!data) data = fs.readFileSync(__dirname + `/../../dist/assets/avatar/default.jpeg`);
  24. }
  25. } else if (type == 'tag') {
  26. try {
  27. data = fs.readFileSync(__dirname + `/../../dist/assets/tag/${id}.png`);
  28. } catch (e) {
  29. }
  30. }
  31. if (!data) throw createError(404, 'Page not found');
  32. dir = path.dirname(originalFilePath);
  33. fs.mkdirSync(dir, { recursive: true });
  34. fs.writeFileSync(originalFilePath, data)
  35. }
  36. dir = path.dirname(thumbFilePath);
  37. fs.mkdirSync(dir, { recursive: true });
  38. await makeThumb(originalFilePath, thumbFilePath, size);
  39. res.sendFile(thumbFilePath);
  40. })().catch(next)
  41. });
  42. module.exports = router;