feat: 添加数据验证功能确保图像有效性
Some checks failed
Build Server / Compile DLL (push) Failing after 1m54s

- 在项目依赖中添加了@hono/zod-validator和zod包。
- 添加依赖库"@hono/zod-validator"和"zod"以增强数据验证功能。
- 添加了请求验证以确保提供了有效的图像文件。
This commit is contained in:
2025-07-18 22:50:23 +08:00
parent 7fca8d8df6
commit 97b4c38863
3 changed files with 28 additions and 17 deletions

View File

@@ -4,7 +4,9 @@
"": { "": {
"name": "wxocr", "name": "wxocr",
"dependencies": { "dependencies": {
"@hono/zod-validator": "^0.7.1",
"hono": "^4.8.4", "hono": "^4.8.4",
"zod": "^4.0.5",
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^4.16.2", "@antfu/eslint-config": "^4.16.2",
@@ -67,6 +69,8 @@
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.3", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag=="], "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.3", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag=="],
"@hono/zod-validator": ["@hono/zod-validator@0.7.1", "", { "peerDependencies": { "hono": ">=3.9.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-8+vJT1RvezAx5sN7hiZ5Mis0RMuFL77nBEcqQQgT9ufoLkxr+7ll461WlBJQcGoQSY6EGMClVae19v3s/7bbgQ=="],
"@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
"@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
@@ -633,6 +637,8 @@
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
"zod": ["zod@4.0.5", "", {}, "sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA=="],
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],

View File

@@ -11,7 +11,9 @@
"typescript": "^5.8.3" "typescript": "^5.8.3"
}, },
"dependencies": { "dependencies": {
"hono": "^4.8.4" "@hono/zod-validator": "^0.7.1",
"hono": "^4.8.4",
"zod": "^4.0.5"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^4.16.2", "@antfu/eslint-config": "^4.16.2",

View File

@@ -1,28 +1,31 @@
import { zValidator } from '@hono/zod-validator'
import { Hono } from 'hono' import { Hono } from 'hono'
import { Buffer } from 'node:buffer' import { Buffer } from 'node:buffer'
import { z } from 'zod'
import { WechatOCRClient } from './wcocr' import { WechatOCRClient } from './wcocr'
const app = new Hono() const app = new Hono()
const client = new WechatOCRClient() const client = new WechatOCRClient()
app.post('/ocr', async (c) => { app.post(
const formData = await c.req.formData() '/ocr',
const imageFile = formData.get('image') zValidator('form', z.object({
image: z.instanceof(File, { message: 'Image file is required' }),
})),
async (c) => {
const { image } = c.req.valid('form')
if (!imageFile || typeof imageFile === 'string') { const imageBuffer = Buffer.from(await image.arrayBuffer())
return c.json({ error: 'Image file is required' }, 400)
}
const imageBuffer = Buffer.from(await imageFile.arrayBuffer()) try {
const result = await client.recognize(imageBuffer)
try { return c.json(JSON.parse(result))
const result = await client.recognize(imageBuffer) } catch (error) {
return c.json(JSON.parse(result)) console.error('OCR processing error:', error)
} catch (error) { return c.json({ error: 'Failed to process image' }, 500)
console.error('OCR processing error:', error) }
return c.json({ error: 'Failed to process image' }, 500) },
} )
})
export default app export default app