当前位置: 首页 > news >正文

CentOS 7 安装条码识别工具 zbar

终端命令

sudo yum install -y epel-release
sudo yum --enablerepo=epel install -y zbar
which zbarimg && zbarimg --version

php代码案例 从图片上传过来 到识别一维码

<?php
//  /shopapi/upload.php
// 作用:上传图片 -> 读取面单条码(优先 Code128) -> 返回单号 ->(可选)入库/* ====== CORS ====== */
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }/* ====== 仅 POST ====== */
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {http_response_code(405);header('Content-Type: application/json; charset=utf-8');echo json_encode(['code'=>405, 'msg'=>'Method Not Allowed'], JSON_UNESCAPED_UNICODE);exit;
}/* ====== JSON 输出工具 ====== */
header('Content-Type: application/json; charset=utf-8');
function j($arr, int $code = 200){http_response_code($code);echo json_encode($arr, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);exit;
}/* ====== 可选:数据库配置(想入库就填) ====== */
$DB_DSN  = ''; // 例:'mysql:host=127.0.0.1;dbname=shop;charset=utf8mb4'
$DB_USER = '';
$DB_PASS = '';
$SAVE_DB = $DB_DSN !== '';/* ====== 工具:拼接当前域名 ====== */
function current_base_url(): string {$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||(isset($_SERVER['SERVER_PORT']) && (int)$_SERVER['SERVER_PORT'] === 443) ||(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https');$scheme = $isHttps ? 'https' : 'http';$host   = $_SERVER['HTTP_HOST'] ?? 'localhost';return $scheme . '://' . $host;
}/* ====== 条码识别函数(优先 Code128,失败再开常见制式) ====== */
function readWaybillFromImage(string $imgPath): ?string {$bin = '/usr/bin/zbarimg';if (!is_file($imgPath)) return null;// 1) 只开 Code128,最快最稳$cmd1 = sprintf('%s --raw --set "*.enable=0" --set "code128.enable=1" %s 2>/dev/null',$bin, escapeshellarg($imgPath));$out = trim(shell_exec($cmd1) ?? '');// 2) 读不到,再开常见的一些(部分快递会用 i25/ean13)if ($out === '') {$cmd2 = sprintf('%s --raw --set "*.enable=0" --set "code128.enable=1" --set "i25.enable=1" --set "ean13.enable=1" %s 2>/dev/null',$bin, escapeshellarg($imgPath));$out = trim(shell_exec($cmd2) ?? '');}if ($out) {// 取 10~18 位数字,且排除 11 位手机号if (preg_match_all('/(?<!\d)(\d{10,18})(?!\d)/', $out, $m)) {foreach ($m[1] as $n) {if (!preg_match('/^1[3-9]\d{9}$/', $n)) return $n;}}}return null;
}/* ====== 接收上传 ====== */
if (empty($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {$err = $_FILES['file']['error'] ?? -1;$map = [UPLOAD_ERR_INI_SIZE=>'文件超出服务器限制',UPLOAD_ERR_FORM_SIZE=>'文件超出表单限制',UPLOAD_ERR_PARTIAL=>'文件只上传了一部分',UPLOAD_ERR_NO_FILE=>'没有接收到文件',UPLOAD_ERR_NO_TMP_DIR=>'临时目录不存在',UPLOAD_ERR_CANT_WRITE=>'文件写入失败',UPLOAD_ERR_EXTENSION=>'扩展中断上传'];j(['code'=>400, 'msg'=>'上传失败:'.($map[$err] ?? '未知错误')]);
}/* ====== 基础校验 ====== */
$allowExt = ['jpg','jpeg','png','gif','webp'];
$maxSize  = 8 * 1024 * 1024; // 8MB
$origName = $_FILES['file']['name'];
$tmpPath  = $_FILES['file']['tmp_name'];
$size     = (int)$_FILES['file']['size'];$ext = strtolower(pathinfo($origName, PATHINFO_EXTENSION));
if (!in_array($ext, $allowExt, true)) j(['code'=>400, 'msg'=>'不支持的图片格式']);
if ($size <= 0 || $size > $maxSize)   j(['code'=>400, 'msg'=>'图片大小不符合要求(最大8MB)']);$finfo = function_exists('finfo_open') ? finfo_open(FILEINFO_MIME_TYPE) : false;
if ($finfo) {$mime = finfo_file($finfo, $tmpPath); finfo_close($finfo);$okM = ['image/jpeg','image/png','image/gif','image/webp'];if (!in_array($mime, $okM, true)) j(['code'=>400, 'msg'=>'文件类型校验失败']);
}/* ====== 保存到 /shopapi/upload/YYYYMMDD ====== */
$rootDir = __DIR__;
$day     = date('Ymd');
$saveDir = $rootDir . '/uploaddanhao/' . $day;
$relDir  = '/shopapi/uploaddanhao/' . $day . '/';
if (!is_dir($saveDir) && !mkdir($saveDir, 0775, true)) j(['code'=>500, 'msg'=>'目录创建失败']);$rand = bin2hex(random_bytes(8));
$saveName = $rand . '.' . $ext;
$dest = rtrim($saveDir, '/').'/'.$saveName;if (!move_uploaded_file($tmpPath, $dest)) j(['code'=>500, 'msg'=>'保存文件失败']);
$idxFile = $rootDir . '/upload/index.html';
if (!file_exists($idxFile)) @file_put_contents($idxFile, '');/* ====== 识别条码 -> 运单号 ====== */
$no = readWaybillFromImage($dest);
$base = current_base_url();
$url  = $base . $relDir . $saveName;
$path = $relDir . $saveName;/* ====== 可选:入库 ====== */
/*
CREATE TABLE `waybills` (`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,`no` VARCHAR(20) NOT NULL,`carrier` VARCHAR(20) DEFAULT NULL,`src_img` VARCHAR(255) DEFAULT NULL,`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`),UNIQUE KEY `uniq_no` (`no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
*/
if ($SAVE_DB && $no) {try {$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,]);$stmt = $pdo->prepare('INSERT IGNORE INTO waybills(no, carrier, src_img) VALUES(?,?,?)');$stmt->execute([$no, null, $path]);} catch (Throwable $e) {// 入库失败不影响本次返回}
}/* ====== 返回 ====== */
if ($no) {j(['code'=>0, 'msg'=>'ok', 'no'=>$no, 'url'=>$url, 'path'=>$path, 'name'=>$saveName]);
} else {j(['code'=>422, 'msg'=>'未读到条码,可换角度/补光再拍', 'url'=>$url, 'path'=>$path, 'name'=>$saveName]);
}
http://www.gsyq.cn/news/40936.html

相关文章:

  • 2025深圳艺考生文化课辅导推荐榜:全日制艺考生文化课培训机构,精准提分机构精选
  • 2025年方形橡胶减震器工厂权威推荐榜单:JGF型减震器/JGF型橡胶减震器/ZA型橡胶减震器源头厂家精选
  • 2025/11/6
  • 2025 年最新推荐立体画厂家权威榜单:涵盖 3D 光栅立体画 / 立体光栅卡 / 3D 装饰立体画 / 三维立体画,专业测评助力精准选择
  • 2025年哈尔滨装修公司推荐:哈尔滨千墨装饰等5家靠谱企业实力揭秘
  • 2025年钢制拍门工厂权威推荐榜单:玻璃钢拍门/防倒灌拍门/浮箱拍门源头厂家精选
  • 2025 年养老院机构排行榜最新推荐:医养康护一体化服务品牌精选,权威测评机构详情揭晓自理老人住/失能老人住/陪伴式/失智失能照护养老院公司推荐
  • 2025 成都全屋定制厂家最新推荐:直营厂家榜单,透明服务与环保性能权威测评解析
  • 2025年全自动编织袋撕碎机定制厂家权威推荐榜单:废布条撕碎机/编织袋撕碎机/薄膜料撕碎机源头厂家精选
  • 软考中级系统集成项目管理计算题(五)
  • 2025年鲁冠高透光农膜企业权威推荐榜单:持久高透光抗老化农膜/95%以上高透光率农膜/黄瓜大棚高透光膜源头厂家精选
  • 2025年tpep防腐钢管制造企业权威推荐榜单:防腐螺旋钢管/防腐无缝钢管/聚乙烯防腐钢管源头厂家精选
  • 11-5 降压电路
  • MySQL用户管理 - 实践
  • LLM 时代,DataAgent WhaleTunnel 如何将数据库变更瞬时 “转译” 为洞察?
  • 2025年靠谱的连锁泡菜加盟公司排名,泡菜加盟正规公司推荐
  • 深入解析:多模态医疗大模型Python编程合规前置化与智能体持续学习研究(中)
  • 前端图片压缩三方库browser-image-compression的使用实践
  • 如何处理旧 iPhone:安全地回收或重新利用 - 实践
  • 【Android】一种应用霸屏方式:设置固定应用
  • 2025年密闭冷却塔品牌排名推荐:密闭冷却塔加工厂价格哪家合理
  • Apache SeaTunnel 支持 Metalake 开发了!避免任务配置敏感信息暴露
  • HR内耗终结者:Moka People实现招聘、人事、薪酬全流程数据一体化,提效200%
  • 告别“功能堆砌陷阱”,2026年企业HR系统选型应聚焦价值而非价格
  • 线程和 Parallel.ForEach 的核心区别
  • 2025年五大文物展柜制造企业推荐,文物展柜来样定制企业全解析
  • 现今西南碳晶板制造厂技术评测与选择指南
  • keycloak~登录时将请求头里某个属性放入UserSessionModel
  • 深入解析:微信开放平台第三方平台,可以管理多个微信小程序
  • 2025年照明灯具源头厂家推荐前十排行权威指南