yusuketk 5 лет назад
Родитель
Сommit
ee6a7ec725
2 измененных файлов с 16 добавлено и 8 удалено
  1. 4 8
      src/server/routes/apiv3/page.js
  2. 12 0
      src/server/service/export.js

+ 4 - 8
src/server/routes/apiv3/page.js

@@ -8,6 +8,7 @@ const { body, query } = require('express-validator');
 const router = express.Router();
 
 const ErrorV3 = require('../../models/vo/error-apiv3');
+const exportService = require('../../service/export');
 
 /**
  * @swagger
@@ -199,7 +200,7 @@ module.exports = (crowi) => {
   router.get('/export/:pageId', validator.export, async(req, res) => {
     try {
       const { pageId } = req.params;
-      const { revisionId = null } = req.query;
+      const { format, revisionId = null } = req.query;
 
       if (pageId == null) {
         return res.apiv3Err(new ErrorV3('Should provided pageId or both pageId and revisionId.'));
@@ -231,13 +232,8 @@ module.exports = (crowi) => {
 
       const markdown = revision.body;
 
-      const Readable = require('stream').Readable;
-      const readable = new Readable();
-      readable._read = () => {};
-      readable.push(markdown);
-      readable.push(null);
-      res.set('Content-Type', 'application/octet-stream');
-      return readable.pipe(res);
+      const fileName = pageId != null ? pageId : revisionId;
+      return exportService.getReadStreamAsFileFromString(res, markdown, fileName, format);
     }
     catch (err) {
       logger.error('Failed to get markdown', err);

+ 12 - 0
src/server/service/export.js

@@ -350,6 +350,18 @@ class ExportService {
     return zipFile;
   }
 
+  createReadStreamAsFileFromString(res, str, format, fileName) {
+    const Readable = require('stream').Readable;
+    const readable = new Readable();
+    readable._read = () => {};
+    readable.push(str);
+    readable.push(null);
+    res.set({
+      'Content-Disposition': `attachment;filename*=UTF-8''${fileName}.${format}`,
+    });
+    return readable.pipe(res);
+  }
+
 }
 
 module.exports = ExportService;