我成功地使用 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
});
}
});