在 POST 请求中将 pdf(或任何文件)作为 json 字符串发送,然后通过 fs 将其写下来
Sending pdf (or any file) over in a POST request as json string and then writing it down by fs
我正在创建一个网站,我需要制作一个后端 POST 服务器。我已经创建了其中的 90%,但我面临的问题是我需要发送 JSON 以及 pdf(通常由 multipart/form-data 发送,但需要不同的路由)。我想要做的是将文件转换为 base64string,在请求中发送它,然后将其恢复并写入文件。整个事情就这样发生了,PDF甚至returns乱码了,但是PDF被转回二进制写入后还是空白页
HTML端JS代码:
async function post(endpoint){
let binaryCV;
let CV = document.getElementById("upfile").files[0];
var reader = new FileReader();
reader.onload = (readerEvt)=>{
var binaryString = readerEvt.target.result;
binaryCV = binaryString;
let xhr = new XMLHttpRequest();
let object = {
name: document.getElementById("ecaName").value,
email: document.getElementById("ecaEmail").value,
phone: document.getElementById("ecaTel").value,
class: document.getElementById("ecaClass").value,
institute: document.getElementById("ecaInstitute").value,
paragraph:{
experience: document.getElementById("ecaExp").value,
why: document.getElementById("ecaWhyPart").value,
changes: document.getElementById("ecaWhatChanges").value,
},
CV: binaryCV,
}
xhr.open("POST", `http://localhost:8080/apply/internship/${endpoint}`,true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(object));
};
await reader.readAsBinaryString(CV);
/*xhr.onload = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML = xhttp.responseText;
}
};*/
}
服务器端 JS 回调:
app.post('/apply/internship/econoxe', async (req, res)=>{
res.sendStatus(200);
let CV = req.body.CV;
fs.writeFileSync(path.join(__dirname,`../CV/${req.body.email}.pdf`),CV)
console.log(req.body);
})
无论我上传什么 PDF,所有这些 returns 100% 空白 PDF(由于某些原因,文件大小比原始文件大)
请帮助
如果你知道任何其他方式来完成我在一个请求和路由中的意思,请告诉!
我找到了答案!
我不得不改变
fs.writeFileSync(path.join(__dirname,`../CV/${req.body.email}.pdf`),CV)
至
fs.writeFileSync(path.join(__dirname,`../CV/${req.body.email}.pdf`),CV,"binary")
这将解决问题
我正在创建一个网站,我需要制作一个后端 POST 服务器。我已经创建了其中的 90%,但我面临的问题是我需要发送 JSON 以及 pdf(通常由 multipart/form-data 发送,但需要不同的路由)。我想要做的是将文件转换为 base64string,在请求中发送它,然后将其恢复并写入文件。整个事情就这样发生了,PDF甚至returns乱码了,但是PDF被转回二进制写入后还是空白页
HTML端JS代码:
async function post(endpoint){
let binaryCV;
let CV = document.getElementById("upfile").files[0];
var reader = new FileReader();
reader.onload = (readerEvt)=>{
var binaryString = readerEvt.target.result;
binaryCV = binaryString;
let xhr = new XMLHttpRequest();
let object = {
name: document.getElementById("ecaName").value,
email: document.getElementById("ecaEmail").value,
phone: document.getElementById("ecaTel").value,
class: document.getElementById("ecaClass").value,
institute: document.getElementById("ecaInstitute").value,
paragraph:{
experience: document.getElementById("ecaExp").value,
why: document.getElementById("ecaWhyPart").value,
changes: document.getElementById("ecaWhatChanges").value,
},
CV: binaryCV,
}
xhr.open("POST", `http://localhost:8080/apply/internship/${endpoint}`,true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(object));
};
await reader.readAsBinaryString(CV);
/*xhr.onload = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML = xhttp.responseText;
}
};*/
}
服务器端 JS 回调:
app.post('/apply/internship/econoxe', async (req, res)=>{
res.sendStatus(200);
let CV = req.body.CV;
fs.writeFileSync(path.join(__dirname,`../CV/${req.body.email}.pdf`),CV)
console.log(req.body);
})
无论我上传什么 PDF,所有这些 returns 100% 空白 PDF(由于某些原因,文件大小比原始文件大)
请帮助
如果你知道任何其他方式来完成我在一个请求和路由中的意思,请告诉!
我找到了答案!
我不得不改变
fs.writeFileSync(path.join(__dirname,`../CV/${req.body.email}.pdf`),CV)
至
fs.writeFileSync(path.join(__dirname,`../CV/${req.body.email}.pdf`),CV,"binary")
这将解决问题