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 个问题
我不知道你想做什么。但请注意,有 URL 长度限制。并且您正试图利用它,这就是您收到此错误的原因。 如果您不想使用 bas64,我不明白您为什么要使用 POST在 URL
最好不要将 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);
})
})
})
我需要使用 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 个问题
我不知道你想做什么。但请注意,有 URL 长度限制。并且您正试图利用它,这就是您收到此错误的原因。 如果您不想使用 bas64,我不明白您为什么要使用 POST在 URL
最好不要将 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); }) }) })