init: 完成了图片加水印
This commit is contained in:
commit
aca23f2326
10 files changed
+499
No files matched your search
@@ -0,0 +1,136 @@
|
||||
import { pathToFileURL } from "bun";
|
||||
import { Hono } from "hono";
|
||||
import { onlySSG } from "hono/ssg";
|
||||
import { validator } from "hono/validator";
|
||||
import { isQuestionOrPlusOrMinusToken } from "typescript/unstable/ast";
|
||||
import { Signature } from "typescript/unstable/sync";
|
||||
|
||||
const appTmp = new Hono()
|
||||
const app = appTmp.basePath("/watermark")
|
||||
|
||||
/**
|
||||
* param: image: 图片大小必须<=10MB
|
||||
* param: payload: 必须是长度<=8的字母大小写或数字组合
|
||||
* param: strength: 取值>=0,一般取值0~1.5
|
||||
* param: outputType: 输出的文件类型,只允许 jpeg | png
|
||||
*/
|
||||
app.post("/encode",
|
||||
validator("form", (val, c) => {
|
||||
const image = val.image
|
||||
const payload = val.payload
|
||||
const strength = val.strength
|
||||
const outputType = val.outputType
|
||||
if (
|
||||
image == undefined ||
|
||||
payload == undefined ||
|
||||
strength == undefined ||
|
||||
outputType == undefined
|
||||
) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Paarameter is invalid"
|
||||
})
|
||||
}
|
||||
|
||||
if ((image as File).size == 0) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Image is empty"
|
||||
})
|
||||
}
|
||||
|
||||
const MAX_IMAGE_SIZE = 10 * 1024 * 1024
|
||||
if ((image as File).size > MAX_IMAGE_SIZE) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Image size is too large, must<=10MB"
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
if ((payload as string).length > 8 || (payload as string).length <= 0) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Parameter[payload] length must > 0 and <= 8"
|
||||
})
|
||||
}
|
||||
|
||||
if (!/^[a-zA-Z0-9]+$/.test(payload as string)) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Parameter[payload] must be an ASCII string"
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
if (isNaN(Number(strength))) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Parameter[strength] must be a number"
|
||||
})
|
||||
}
|
||||
|
||||
const tmpStrength = Number(strength)
|
||||
if (tmpStrength < 0 || tmpStrength > 100) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Parameter[strength] must >= 0 and <= 100"
|
||||
})
|
||||
}
|
||||
|
||||
if (
|
||||
!((outputType as string) == "jpeg" ||
|
||||
(outputType as string) == "png")
|
||||
) {
|
||||
c.status(400)
|
||||
return c.json({
|
||||
code: 400,
|
||||
msg: "Parameter[outputType] only support jpeg and png"
|
||||
})
|
||||
}
|
||||
|
||||
return val
|
||||
}),
|
||||
async (c) => {
|
||||
const formData = await c.req.formData()
|
||||
const image: File = formData.get("image") as File
|
||||
const payload: string = formData.get("payload") as string
|
||||
const strength: number = Number(formData.get("strength"))
|
||||
const outputType: string = formData.get("outputType") as string
|
||||
|
||||
const data = new FormData()
|
||||
data.append("image", image)
|
||||
data.append("payload", payload)
|
||||
data.append("strength", strength.toString())
|
||||
data.append("outputType", outputType)
|
||||
let canFetch: boolean = true
|
||||
const response = await fetch("http://localhost:8081/watermark/encode", {
|
||||
method: "POST",
|
||||
body: data
|
||||
}).catch((e) => {
|
||||
canFetch = false
|
||||
})
|
||||
|
||||
if (!canFetch) {
|
||||
c.status(500)
|
||||
return c.json({
|
||||
code: 500,
|
||||
msg: "Cannot fetch http://localhost:8081/watermark/encode"
|
||||
})
|
||||
}
|
||||
|
||||
const resImage = await response!.blob()
|
||||
return c.body(resImage)
|
||||
})
|
||||
|
||||
export default {
|
||||
port: 8080,
|
||||
fetch: app.fetch
|
||||
}
|
||||
Reference in new issue
Block a user