Node.js nodejs将blob(base64)作为映像服务
我知道还有两个类似的问题,但我的问题就是不起作用,我也不知道为什么 我正在尝试在nodejs服务器上提供保存在base64中的blob映像 它只是不上菜,我不知道为什么。如果我注释掉“writeHead”部分,它将显示base64。我试过使用Node.js nodejs将blob(base64)作为映像服务,node.js,Node.js,我知道还有两个类似的问题,但我的问题就是不起作用,我也不知道为什么 我正在尝试在nodejs服务器上提供保存在base64中的blob映像 它只是不上菜,我不知道为什么。如果我注释掉“writeHead”部分,它将显示base64。我试过使用数据:image/jpeg和不使用。我还尝试将其转换为缓冲区。我就是想不通 base64映像小于200 kb,并保存在mediumblob中 有人能看出我做错了什么吗 app.get("/f/:id", async function(re
数据:image/jpeg
和不使用。我还尝试将其转换为缓冲区。我就是想不通
base64映像小于200 kb,并保存在mediumblob中
有人能看出我做错了什么吗
app.get("/f/:id", async function(req, res) {
r = await Files.get(req);
if(r.err.code){
console.log("error",r);
}
var file = r.res.file;
res.writeHead(200, {
'Content-Type': 'image/png',
'Content-Length': file.length
});
res.end(file);
});
下面是它在浏览器中的外观
下面是未启用writeHead时的情况
注意:底部的“viewPortSize”id元素是一个扩展
编辑#1:在Firefox上还显示“由于错误,图像无法显示”
这一定意味着我把它编错了base64,对吧
编辑#3:实际上它被正确地保存了,因为如果我删除标题并将其显示为带有img和src的html,它会正确地显示图像。现在我真的不知道问题出在哪里了
编辑#2:下面是app.js的设置
// ==============================================
// Base setup
// ==============================================
process.env.TZ = "Etc/GMT"
const express = require('express');
const session = require('express-session');
const app = express();
const port = 3075;
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({limit: '50mb', extended: true }));
app.use(bodyParser.json({limit: '50mb'}));
app.use(require('express-useragent').express());
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}))
// Cors
app.use(async function(req, res, next) {
let allowOrigins = [
// removed for SO
];
if(Config.Env === Environments.Local){
res.header("Access-Control-Allow-Origin", "*");
req.session.language = req.query.lg;
}else{
res.header("Access-Control-Allow-Origin", Config.FrontEnd.Url);
var origin = req.get('origin');
for (let i = 0; i < allowOrigins.length; i++) {
const allowOrigin = allowOrigins[i];
if(origin.match(allowOrigin)){
res.header("Access-Control-Allow-Origin", origin);
}
}
var subdomain = origin.split('.')[0];
for (let j = 0; j < availableLanguages.length; j++) {
const lang = availableLanguages[j];
if(lang.code === subdomain){
req.session.language = lang.code;
break;
}
}
}
// if(Config.Env !== Environments.Local){
if(req.session.language !== undefined && req.session.language !== "en"){
Config.FrontEnd.Url = Config.FrontEnd.Url.replace("://", "://"+req.session.language+".");
}
// }
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, auth-id, auth-token, x-csrf-token, _csrf");
res.header('Access-Control-Allow-Methods', 'PATCH, POST, GET, DELETE, OPTIONS');
next();
});
//==============================================
//基本设置
// ==============================================
process.env.TZ=“Etc/GMT”
const express=require('express');
const session=require('express-session');
常量app=express();
常数端口=3075;
const bodyParser=require('body-parser');
use(bodyParser.urlencoded({limit:'50mb',extended:true}));
use(bodyParser.json({limit:'50mb'}));
app.use(require('express-useragent').express());
应用程序使用(会话)({
秘密:“键盘猫”,
resave:false,
saveUninitialized:true,
cookie:{secure:true}
}))
//科尔斯
应用程序使用(异步函数(req、res、next){
设allowOrigins=[
//因此被免职
];
if(Config.Env==Environments.Local){
res.header(“访问控制允许原点”、“*”);
req.session.language=req.query.lg;
}否则{
res.header(“访问控制允许来源”,Config.FrontEnd.Url);
var origin=req.get('origin');
for(设i=0;i
编辑#4:如果我像这样发送它(上面有数据部分),图像会显示它应该显示的样子。但是,标题不是图像的标题。(如果我更改为图像,它将返回到黑屏)
app.get(“/f/:id”),异步函数(req,res){
r=等待文件。获取(req);
if(r.错误代码){
console.log(“错误”,r);
}
var file=r.res.file;
res.end(
''+
''+
''+
''+
''+
''
);
});
如果数据库存储数据:image/png;base64,xxxx
字符串,则需要将其转换回二进制数据,以作为内容类型为image/png
的响应的一部分(类似于常规图像文件)
如果第四次编辑有效,您似乎拥有了整个
数据:image/png;数据库中的base64,xxxx
字符串?要在image/png
响应中使用它,请去掉数据:image/png;base64,
并转换base64中的剩余图像数据。响应和长度应该来自该转换的结果。@Matt如果我从blob中删除“data:image/png;base64”,转换base64字符串后它仍然显示黑色屏幕Buffer.from(base64string\u来自文件'base64')
非常感谢Matt。这立刻奏效了。我真的很感谢你解释为什么它不起作用。谢谢,谢谢!!
app.get("/f/:id", async function(req, res) {
r = await Files.get(req);
if(r.err.code){
console.log("error",r);
}
var file = r.res.file;
res.end(
'<html>'+
'<head></head>'+
'<body>'+
'<img src="'+file+'">'+
'</body>'+
'</html>'
);
});
const img_base64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
const server = require('http').createServer((req,res)=>{
console.log('got req', req.url)
// Extract image data
const m = /^data:(.+?);base64,(.+)$/.exec(img_base64)
if (!m) throw new Error(`Not a base64 image [${img_base64}]`)
const [ _, content_type, file_base64 ] = m
const file = Buffer.from(file_base64,'base64')
res.writeHead(200, {
'Content-Type': content_type,
'Content-Length': file.length
});
res.end(file);
})
server.listen(3132, ()=> console.log('hi', server.address()))