hooks
hooks copied to clipboard
输出图片问题
比如需要在服务端动态生成qrcode的场景下
如下代码:
import { Api, Get, useContext } from "@midwayjs/hooks";
export const test = Api(Get(), async () => {
const ctx = useContext();
ctx.type = "png";
const base64Png =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABUCAYAAAAcaxDBAAAAAklEQVR4AewaftIAAAIySURBVO3BQW5rSQwEwSyi73/lnFkSWrTxIFryBxgRQD5I5SYJncpNEjqVLgmfVKxRxRpVrFGHFyqTkjApCZ3KEyqTktAVa1SxRhVr1OEHSXhC5YkkdCqflIQnVG6KNapYo4o1qlijijWqWKOKNerwZSpdEv5lxRpVrFHFGnX4gco3qfwmlUnFGlWsUcUadXiRhE9KQqfSJaFT6ZLQqdwk4TcVa1SxRhVr1FH5JpUuCZNUPqlYo4o1qlijDg8l4UalS8KNyo3KJyXhRuWmWKOKNapYow4vktCpdCpdEm5UbpLQqXRJuFHpktCp3CShU3kiCV2xRhVrVLFGBZA3qHRJuFF5RxLeodIloVPpknCj0hVrVLFGFWtUAGlUbpLwhEqXhN+k0iWhU7lJwo1Kl4SuWKOKNapYo45Kl4RO5UalS0KXhBuVLgmdSpeEmyR8U7FGFWtUsUbF//FFSehUuiRMUrlJQqfyRLFGFWtUsUadJHySyjtUbpLQqXRJuFHpknCj0hVrVLFGFWvU4YXKpCTcqHRJ6FS6JLxDpUtCl4R3FGtUsUYVa9ThB0l4QuWJJHQqXRKeULlJQqfSJaFTuUlCV6xRxRpVrFGHPyYJncpNErok3Kh0SbhJQqfSqXTFGlWsUcUadfgylS4JXRI6lRuVLgldEp5Q6ZJwU6xRxRpVrFGHH6j8JUm4SUKn0iXhRuVGpUtCV6xRxRpVrFGHF0n4y1TeofKOJHQqXbFGFWtUsUb9B7x87rg3rZ9/AAAAAElFTkSuQmCC";
const png = base64Png.replace(/^data:image\/\w+;base64,/, "");
ctx.body = Buffer.from(png, "base64");
});
返回的图会有问题
尝试过在标准项目,相同的代码是图片是正常显示的
生成 qrcode 后,前端直接范围接口地址获取图片吗?
是直接放到标签src里面
我现在是直接把这个Buffer通过fs写到public里面然后redirect去这个图片可以workaround。但是这个是绕了一圈,貌似直接给ctx.body 赋值 Buffer,输出结果会被处理过然后图片不能正常显示。
const ctx = useContext<Context>();
// ...一些通过canvas库生成海报的逻辑...
const dataUrl = canvas.toDataURL()
const img = dataUrl.replace(/^data:image\/\w+;base64,/, "");
const buffer = Buffer.from(img, "base64"); // 把base64码转成buffer对象,
const basename = `public/${uuid()}.png`;
const filePath = path.join(this.appDir, basename).toLocaleLowerCase();
fs.writeFileSync(filePath, buffer);
ctx.redirect(`/${basename}`);
我debug了一下,貌似是在serverless-dev-pack
这个模块里面被处理text了
https://github.com/midwayjs/cli/blob/4ec53aba0c3fc5f6d3a2c609a6e00ae7b71901f3/packages/dev-pack/src/common.ts#L85-L91
我debug了一下,貌似是在
serverless-dev-pack
这个模块里面被处理text了midwayjs/cli@
4ec53ab
/packages/dev-pack/src/common.ts#L85-L91
这部分我正在重写,看看怎么解决非 json 格式的传递问题
我debug了一下,貌似是在
serverless-dev-pack
这个模块里面被处理text了 midwayjs/cli@4ec53ab
/packages/dev-pack/src/common.ts#L85-L91这部分我正在重写,看看怎么解决非 json 格式的传递问题
目前gateway有一个参数isBase64Encoded
不知道是否可以用到呢?
https://github.com/midwayjs/cli/blob/3cd2902821167905d789df5a153bed2224920613/packages/gateway-common-http/src/index.ts#L44-L47
目前gateway有一个参数
isBase64Encoded
不知道是否可以用到呢? midwayjs/cli@3cd2902
/packages/gateway-common-http/src/index.ts#L44-L47
应该是可以的,目前更倾向于使用 http-proxy 转发所有请求,这样也可以支持 websocket 等更多协议