javascript - Node.js - jQuery。从服务器获取PDF并在前端显示

标签 javascript jquery node.js ajax pdf

我有点被困在这里了。我的目的是首先从静态文件夹+子文件夹中获取所有文件(文件名)并在前端列出所有文件。

当用户单击其中一个文件名(主要是 pdf)时,服务器会返回所选项目的内容。

我能够将 pdf 数据作为二进制发送到前端,但是如何使用 js/jQuery 在新选项卡中显示数据?

到目前为止..

服务器.js -

// Importing and initializing npm/node plugins
var app = require('express')();
var server = require('http').createServer(app);
var logger = require('morgan');
var bodyParser = require('body-parser');
var pdf = require('express-pdf');
var cors = require('cors');
var fs = require('fs');

// Import config settings
var config = require('./config.json');

app.use(logger('dev'));

// Allow application/x-www-form-urlencoded and application/json
app.use(bodyParser.urlencoded({
    extended: false
}));

app.use(bodyParser.json({
    limit: '50mb'
}));

app.use(cors());

app.use(pdf);

app.get('/getfiles', function (req, res) {
    var dir = config.sourceDir;

    var foundFiles = [];

    fs.readdir(dir, function (err, files) {
        if (err) {
            console.log('Error reading ' + dir);
            process.exit(1);
        }
        console.log('Listing files in Directory ' + dir);
        files.forEach(function (f) {
            foundFiles.push(f);
        });
        res.json(foundFiles);
    });
});

app.post('/showfiles', function (req, res) {
    var file = req.body.filename;
    var dir = config.sourceDir;
    fs.readFile(dir + file, function (err, data) {
        res.contentType('application/pdf');
        res.send(data);
    });
});

// Open server in port
server.listen(config.port, function () {
    console.log('Server listening on port: ' + config.port);
});

module.exports = app;

在前端 -

$(function () {

    getFiles();

});

function getFiles() {
    $.ajax({
        type: "GET",
        url: "http://localhost:3000/getfiles",
        contentType: "application/json; charset=utf-8",
        crossDomain: true,
        dataType: "json",
        success: function (data, status, jqXHR) {
            if (data) {
                $.each(data, function (index, value) {
                    $("#listContainer1").append("<li><a href='#' onclick='showFile(this)'>" + value + "</a></li>");
                });
            }
        },
        error: function (jqXHR, status) {
            console.log("Error fetching data");
        }
    });
}

function showFile(file) {
    $.ajax({
        type: "POST",
        data: JSON.stringify({
            "filename": $(file).text()
        }),
        url: "http://localhost:3000/showfiles",
        contentType: "application/json; charset=utf-8",
        crossDomain: true,
        dataType: "application/pdf",
        success: function (data, status, jqXHR) {
            if (data) {
                var file = new Blob([data], {
                    type: 'application/pdf'
                });
                var fileURL = URL.createObjectURL(file);
                window.open(fileURL);
            }
        },
        error: function (jqXHR, status) {
            console.log("Error showing file");
        }
    });
}

但这不断陷入“显示文件时出错”的坑。 :(

编辑:

通过从帖子中删除“application/pdf”纠正了第一个错误,但现在它打开了一个具有正确页数限制的空 pdf

最佳答案

在服务器上,将文件获取代码更改为:

app.get('/showfiles/:filename', function (req, res) {
  var options = {
    root: config.sourceDir
  };

  var fileName = req.params.filename;
  res.sendFile(fileName, options, function (err) {
    if (err) {
      // Handle error
    } else {
      // Handle success
    }
  });
});

所以我将方法切换为GET并使用Express中内置的sendFile方法。那么前端就容易多了。您可以去掉 showFile 函数,只更新 getFiles 函数:

function getFiles() {
    $.ajax({
        type: "GET",
        url: "http://localhost:3000/getfiles",
        contentType: "application/json; charset=utf-8",
        crossDomain: true,
        dataType: "json",
        success: function (data, status, jqXHR) {
            if (data) {
                $.each(data, function (index, value) {
                    $("#listContainer1").append('<li><a href="http://localhost:3000/showfiles/'+value+'" target="_blank">' + value + '</a></li>');
                });
            }
        },
        error: function (jqXHR, status) {
            console.log("Error fetching data");
        }
    });
} 

代码尚未经过测试,很可能存在错误,但应该为您提供解决问题的另一种方法的要点。

关于javascript - Node.js - jQuery。从服务器获取PDF并在前端显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43944659/

相关文章:

子目录中的javascript文件未加载

jquery - 动态内容网址

node.js - 如何获取后端发送的前端paypal结账链接

javascript - 模拟 ("click")在弹出的react-create-app项目测试中不会导致重新渲染

javascript - 如何防止android表单跳过表单中的部分?

php - 调用php文件并请求某些变量/信息然后显示在div中

javascript - 错误 : TypeError: $(. ..).dialog 不是函数

node.js - 如何使用sendHandle不丢失数据?

node.js - 如何在 Node.js 中列出所有 MongoDB 数据库?

javascript - 如何获取所有带有 "click"事件的元素与 jQuery 相关联?