Javascript、块和 NodeJs

Javasctipt, Chunks and NodeJs

我需要使用 nodeJs 服务器将文件上传到 Postgres 数据库。在前端 (vueJs) 我有 <input ref="file_upload" type="file" multiple="true" @change="changeFile" > 元素,我可以在其中选择文件。在我 select 想要的文件之后,我使用以下代码将其转换为 base64 字符串:

        var file_input = this.$refs.file_upload
        var base64String

        function changeFile() {
            for(let i = 0; i < file_input.files.length; i++) {

                var reader = new FileReader();

                reader.onloadend = () => {
                    base64String = reader.result
                        .replace('data:', '')
                        .replace(/^.+,/, '');

                    console.log(base64String)
                    console.log("SIZE: " + base64String.length)

                }
                
                reader.readAsDataURL(file_input.files[i]);

            }
        } 

        file_input.addEventListener('change', changeFile);

将其转换为 base64 字符串后,单击按钮我使用以下代码创建 post 请求:


btnSubmit.addEventListener("click", () => {

            let dat_title = file_input.files[0].name;

            let url_files = "http://localhost:3000/blobFile/" + dat_title + "/" + base64String

            console.log("URL:\n" + url_files)

            fetch(url_files, {
                method: "POST"
            })
            .then(response => {
                response.json().then(parsedJson => {

                    console.log(parsedJson);

                }) 
            })

        })

这就是问题开始的地方。如果base64字符串的大小小于16kB,一般会做一个post请求,会插入数据库table(column是bytea类型,所以在插入之前我解码 base64 字符串)。但是,如果 base64 字符串的大小超过 16kB,它会显示一个错误,说明获取失败。所以我发现 URL 太大而无法获取,我需要将其分成块。我的问题是我该怎么做。如何将 base64 字符串拆分成块并在 nodeJs 服务器上接收这些块?我已经尝试了数百万种解决方案,但没有任何效果。如果您知道如何解决这个问题,请写下来。下面是nodeJs服务器配置:

app.js

require('dotenv').config(); 

var express = require('express');
var cors = require('cors');
var app = express();
const pool = require('./dbConnect');
const port = 3000;

app.use(cors());

app.post("/blobFile/:title/:url(*)", pool.postBlobFile)

app.listen(port, () => {
    var host = "localhost";
    console.log(`Server listening on port http://%s:%s`, host, port);
})

dbConnect.js

const postBlobFile = (req, res) => {
    const dat_title = req.params.title
    var base64String = req.params.url

    console.log("TITLE: " + dat_title)
    console.log("STRING: " + base64String)
    console.log("STRING_SIZE: " + base64String.length)

    pool.query(`insert into test_blob (dat_naziv, dat_blob) 
            values ('${dat_title}', decode('${base64String}', 'base64'))`, 
    (err, results) => {
        if (err) console.log(err);
        else{
            res.json(results.rows)
        }
    })
}

module.exports = {
    pool,
    postBlobFile,
}

提前致谢

POST 是有原因的。您正在使用 GET,POST 在您的代码中毫无用处

我发现了 2 个问题

  1. 我不知道你想做什么。但请注意,有 URL 长度限制。并且您正试图利用它,这就是您收到此错误的原因。 如果您不想使用 bas64,我不明白您为什么要使用 POST在 URL

  2. 最好不要将 Postgres 用于 blob 或字节类型的东西。只是一个建议。使用 s3 或空格之类的东西。

    btnSubmit.addEventListener("click", () => {
    
         let dat_title = file_input.files[0].name;
    
         let url_files = "http://localhost:3000/blobFile/"
    
         console.log("URL:\n" + url_files)
    
         fetch(url_files, {
             method: "POST",
             'data | body': {'**Your data over here**'}
         })
         .then(response => {
             response.json().then(parsedJson => {
    
                 console.log(parsedJson);
    
             }) 
         })
    
     })