hooks icon indicating copy to clipboard operation
hooks copied to clipboard

输出图片问题

Open rojer95 opened this issue 2 years ago • 7 comments

比如需要在服务端动态生成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");
});

返回的图会有问题

尝试过在标准项目,相同的代码是图片是正常显示的

rojer95 avatar Apr 13 '22 14:04 rojer95

生成 qrcode 后,前端直接范围接口地址获取图片吗?

Lxxyx avatar Apr 14 '22 01:04 Lxxyx

是直接放到标签src里面

rojer95 avatar Apr 14 '22 02:04 rojer95

我现在是直接把这个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}`);

rojer95 avatar Apr 14 '22 02:04 rojer95

我debug了一下,貌似是在serverless-dev-pack这个模块里面被处理text了

https://github.com/midwayjs/cli/blob/4ec53aba0c3fc5f6d3a2c609a6e00ae7b71901f3/packages/dev-pack/src/common.ts#L85-L91

rojer95 avatar Apr 17 '22 08:04 rojer95

我debug了一下,貌似是在serverless-dev-pack这个模块里面被处理text了

midwayjs/cli@4ec53ab/packages/dev-pack/src/common.ts#L85-L91

这部分我正在重写,看看怎么解决非 json 格式的传递问题

Lxxyx avatar May 10 '22 01:05 Lxxyx

我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

rojer95 avatar May 10 '22 01:05 rojer95

目前gateway有一个参数isBase64Encoded不知道是否可以用到呢? midwayjs/cli@3cd2902/packages/gateway-common-http/src/index.ts#L44-L47

应该是可以的,目前更倾向于使用 http-proxy 转发所有请求,这样也可以支持 websocket 等更多协议

Lxxyx avatar May 10 '22 03:05 Lxxyx