不使用<form>将图像上传到Node.JS服务器

时间:2019-04-21 21:37:12

标签: javascript node.js image-uploading

我有一个node.js服务器,它使用express-fileupload接受图像。现在,我正在使用上载图像的功能。但是我不想使用

,因为出于各种原因我更喜欢xhtml请求,主要是因为我不想在用户上传图像后重定向用户。

我曾尝试将图片作为dataURI读取,发送到服务器,对其进行解码并将其写入文件,但这没有用,而且似乎占用大量资源和精力。

//I used the dataString from the callback method and wrote it to a file using fs.writeFile
function dataURItoimage(dataString, callback){
   const atob = require("atob");

   dataString.replace("data:image/jpeg;base64,", "");
   dataString.replace("data:image/png;base64,", "");

   atob(dataString);
   callback(null, dataString);
}
//User side code
avatarInput.addEventListener("change", (e) => {
    const reader = new FileReader();
    reader.readAsDataURL(avatarInput.files[0]);
    reader.onload = () => {
        avatar = reader.result;
        tosend.avatar = reader.result;
    }
}, false);

uploadButton.onclick = () => {
    var request = new XMLHttpRequest();
    request.open("POST", "/avatarUpload");
    request.setRequestHeader("Content-Type", "application/json");

    var tosend = {avatar: ""};
    tosend.avatar = avatar;

    request.send(JSON.stringify(tosend));
}

是否有更好的方式将用户可以选择的图像上传到node.js服务器?

2 个答案:

答案 0 :(得分:1)

所以我是这样做的:

    var request = new XMLHttpRequest();
    request.open("POST", "/test");

    var fd = new FormData();
    fd.append("file", avatarInput.files[0]);
    request.send(fd);

我创建了一个FormData对象,附加了图像,用户在名为“ avatarInput”的输入中选择了该图像,然后将该对象发送到服务器。 在服务器端,我使用express-fileupload访问文件:

app.post("/test", (req, res) => {
    if(req.files){
        //With the follwing command you can save the recieved image
        req.files.file.mv("./file.png",  (err) => {if(err)throw err});
    }
    res.end();
});

答案 1 :(得分:0)

您可以尝试以下示例。它为我工作。希望它能对您有所帮助。

发送dataURL引发Ajax请求:

const dataURL = snapshotCanvas.toDataURL('image/png');
$.ajax({
    url: 'http://localhost:3000/upload-image',
    dataType: 'json',
    data: { data: dataURL },
    type: 'POST',
    success: function(data) {}
});

接收请求:

router.post('/', (req, res) => {
    const base64 = req.body.data.replace(/^data:image\/png;base64,/, "");
    fs.writeFileSync(`uploads/images/newImage.jpg`, base64, {encoding: 'base64'});
}