0

我成功地使用 base64 url​​ 将图像存储在 mongodb 中。但是当我尝试对 PDF 执行此操作时,它给出了一个不起作用的 url。等等,让我解释一下,当我将图像 base64 url​​ 放在 POST 请求的 req.body 中时,特殊标志会消失,所以我尝试encodeURIComponent()了使其无错误的方法。之后我发现将巨大的字符串存储在 mongodb 中太短而无法放入数据库中,所以我尝试了:app.use(express.json({limit: '50mb'})); app.use(express.urlencoded({limit: '50mb', extended: false }));它成功了!但是当客户端请求 base64 url​​ 时,它会被编码,所以我把decodeURIComponent()它解码,这不是一个大问题,我得到了想要的结果,但使用的是 Image 一个。

主要问题是PDF。我不知道为什么它只发生在 PDF 上!当我在 CLIENT 端创建 base64 url​​ 并对其进行测试时,它工作正常,但是当涉及到服务器端时,所有的混乱都会发生。请帮我处理这个问题。

注意:“我不想使用 Gridfs、formidabe、multer 等来处理文件”

这是我的一段代码:

  $('#seasonForm').submit(async function (e) {
                e.preventDefault();
                const form = $(this);

                const ImgFile = document.getElementById('seasonThumbnail').files[0];
                const PDFFile = document.getElementById('seasonPDF').files[0];

                const imgurl = encodeURIComponent(await getBase64(ImgFile));
                const PDFurl = encodeURIComponent(await getBase64(PDFFile));
                const url = '/uploadSeason';

                $.ajax({
                    type: "POST",
                    url: url,
                    data: form.serialize()+`&Version=<%- NxtSeasons %>&image=${imgurl}&PDF=${PDFurl}`,
                    success: data => {
                        console.log(data.message);
                        if (data.status == "error") {
                            showIt(".alert", data.message, "error");



                        } else {
                            showIt(".alert", data.message, "success");
                        }
                    }
                });
            })

等等,现在不要与getBase64()and混淆showIt。这些是我的功能。getBase64()是一个promice,它返回文件的base64 url​​,showIt()是我制作的警报类型。现在,如果您不知道什么是 base64 url​​,这是 getBase64 的代码:

 const getBase64 = (file) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });
}

我的nodejs代码:

app.post("/uploadSeason", admin, async (req, res) => {
    try {
        const { Name, Desctiption, Version, image, PDF } = req.body;
        const newSeason = new Season({
            Name,
            Desctiption,
            Version,
            image: encodeURIComponent(image),
            PDF: encodeURIComponent(PDF),
        });
        

        await newSeason.save();
        res.json({
            status: "success",
            message: "Season added successfully"
        });

    } catch (e) {
        console.log(e);
        res.json({
            status: "error",
            message: e
        });
    }
});
4

0 回答 0