yusuketk 5 лет назад
Родитель
Сommit
11768fb705
2 измененных файлов с 23 добавлено и 34 удалено
  1. 17 1
      src/server/routes/apiv3/page.js
  2. 6 33
      src/server/service/export.js

+ 17 - 1
src/server/routes/apiv3/page.js

@@ -229,7 +229,23 @@ module.exports = (crowi) => {
       const revision = await Revision.findById(revisionIdForFind);
 
       const markdown = revision.body;
-      return await exportService.createExportStream(res, revisionId, markdown, type);
+      const buf = await exportService.convertToPdfFromMd(markdown);
+      const ab = new ArrayBuffer(buf.length);
+      const view = new Uint8Array(ab);
+      for (let i = 0; i < buf.length; ++i) {
+        view[i] = buf[i];
+      }
+      // const ab = new Uint8Array(buf).buffer;
+
+      const { Readable } = require('stream');
+      const readable = new Readable();
+      readable._read = () => {};
+      readable.push(ab);
+      readable.push(null);
+      return readable.pipe(res);
+      // res.type('arraybuffer');
+      // res.setHeader('Content-Type', 'application/pdf');
+      // return res.send(ab);
     }
     catch (err) {
       logger.error('Failed to get page', err);

+ 6 - 33
src/server/service/export.js

@@ -351,40 +351,13 @@ class ExportService {
     return zipFile;
   }
 
-  async createExportStream(res, tmpFileName, markdown, type) {
-    let fileStream;
-    let filePath;
-    const baseDir = path.join(this.crowi.tmpDir, 'exports');
-
-    try {
-      // create tmp file
-      if (type === 'md') {
-        filePath = path.join(baseDir, `${tmpFileName}.md`);
-        await fs.writeFileSync(filePath, markdown);
-      }
-      else if (type === 'pdf') {
-        filePath = path.join(baseDir, `${tmpFileName}.pdf`);
-        await this.convertToPdfAndWriteFile(markdown, filePath);
-        res.contentType('application/pdf');
-      }
-      else {
-        throw new Error('requested file format is invaild');
-      }
-      fileStream = fs.createReadStream(filePath);
-    }
-    catch (e) {
-      logger.error(e);
-      return new Error(e);
-    }
-
-    return fileStream.pipe(res);
-  }
-
-  async convertToPdfAndWriteFile(md, path) {
+  async convertToPdfFromMd(md) {
     return new Promise((resolve, reject) => {
-      markdownpdf().from.string(md).to(path, () => {
-        resolve(path);
-      });
+      markdownpdf()
+        .from.string(md)
+        .to.buffer({}, (opt, buffer) => {
+          resolve(buffer);
+        });
     });
   }