在Java中如何像docsify一样处理MarkDown文件
概述
现在自己搭建博客越来越常见。在程序员的世界里更加流行用 markdown
来写博客,本文就 docsify
的后端实现部分做简单模拟。
原理
基本流程如下:
- 前端上传MarkDown文件
- 后端将文件存储在文件服务器(OSS、FastDFS、本地…)
- 前端根据文件名请求接口url
- 后端将MarkDown文件以流的形式返回
- 前端获取到流后根据MarkDown语法标签映射为css对应选择器(markdown-it…)
- 浏览器渲染
基本实现
application.yml
1 2 3 4 5 6
| spring: servlet: multipart: max-file-size: 10240 max-request-size: 10240 enabled: true
|
UploadController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| @Slf4j @RestController @RequestMapping("/test") public class UploadController {
String filePath = "";
@RequestMapping(value = "/upload", method = {RequestMethod.GET, RequestMethod.POST}) public Object upload(@RequestParam(value = "file", required = false) MultipartFile file) {
String dir = System.getProperty("user.dir"); filePath = dir + "\\src\\main\\resources\\static\\md\\";
String filename = file.getOriginalFilename(); File dest = new File(filePath + filename); try { file.transferTo(dest); log.info("上传成功"); return "upload success"; } catch (IOException e) { e.printStackTrace(); return "upload failed"; } }
@GetMapping("/render/{name}") public void md(@PathVariable String name, HttpServletResponse response) throws IOException {
String dir = System.getProperty("user.dir"); filePath = dir + "\\src\\main\\resources\\static\\md\\";
InputStream inputStream = new FileInputStream(new File(filePath, name)); OutputStream outputStream = response.getOutputStream(); response.addHeader("Content-Length", String.valueOf(inputStream.available())); response.setHeader("Accept-Ranges", "bytes"); response.setContentType("text/markdown"); IOUtils.copy(inputStream, outputStream); outputStream.flush(); }
@GetMapping("/download/{name}") public void download(@PathVariable String name, HttpServletResponse response) throws IOException { InputStream inputStream = new FileInputStream(new File(filePath, name)); OutputStream outputStream = response.getOutputStream(); response.setContentType("application/x-download"); response.setHeader("Content-Disposition", "attachment;filename=" + name); IOUtils.copy(inputStream, outputStream); outputStream.flush(); } }
|
响应头
request1 2 3 4 5 6
| Accept-Ranges: bytes Connection: keep-alive Content-Length: 23 Content-Type: text/markdown Date: Mon, 18 May 2020 04:50:00 GMT Keep-Alive: timeout=60
|
响应体
访问 http://localhost:8080/test/render/TEST.md , 可见响应体就是我们上传的markdown文件内容
最后
本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】支持一下。