通达OA公用组件使用指南
一、引言文件附件处理是OA系统的核心功能之一涉及文件上传、存储、下载、预览、删除等多个环节。通达OA提供了完善的文件附件处理机制通过utility_file.php文件中的一系列函数实现。本文将深入解析OA的文件附件处理机制包括上传流程、存储结构、权限控制和最佳实践。二、文件附件架构总览2.1 架构设计2.2 文件存储结构通达OA的附件存储采用数据库文件系统的架构数据库存储附件元数据文件名、大小、类型、上传时间等附件ID用于关联业务数据文件系统存储实际文件内容按模块和日期分目录存储2.3 附件ID编码机制OA使用特殊的编码方式生成附件ID三、文件上传机制3.1 upload() - 文件上传函数upload($field_name, $allow_types , $max_size 0, $module , $uid 0)功能处理文件上传参数说明参数类型默认值说明field_namestring-文件表单字段名allow_typesstring允许的文件类型max_sizeint0最大文件大小KB0为不限制modulestring模块名称uidint0用户ID默认当前用户返回值返回字段说明error错误码0成功其他失败id附件IDname原始文件名size文件大小type文件类型path文件路径示例include_once(inc/utility_file.php); // 处理文件上传 if ($_FILES[attachment][name]) { $result upload(attachment, , 20480, project); if ($result[error] 0) { $attach_id $result[id]; // 保存附件ID到业务表 $td-query(UPDATE project SET attach_id $attach_id WHERE project_id 1); } else { Message(_(上传失败) . $result[error], , error); } }3.2 上传流程3.3 上传表单示例form methodpost actionupload.php enctypemultipart/form-data input typefile nameattachment multiple button typesubmit?php echo _(上传); ?/button /form注意事项必须设置enctypemultipart/form-data支持多文件上传multiple属性文件名尽量使用中文四、附件管理函数4.1 添加附件4.1.1 add_attach() - 添加附件add_attach($module, $record_id, $attach_ids, $uid 0)功能为记录添加附件参数说明参数类型说明modulestring模块名称record_idint记录IDattach_idsstring附件ID多个用逗号分隔uidint用户ID示例add_attach(project, 1, 123,456,789);4.1.2 add_attach_module() - 注册附件模块add_attach_module($module_name, $module_title)功能注册新的附件模块参数说明参数类型说明module_namestring模块名称英文module_titlestring模块标题中文示例add_attach_module(project, _(项目管理));4.2 删除附件4.2.1 delete_attach() - 删除附件delete_attach($attach_id)功能删除指定附件参数$attach_id- 附件ID返回值true或false示例delete_attach(123456);4.2.2 delete_attach_old() - 删除旧版附件delete_attach_old($attach_id)功能删除旧版附件格式参数$attach_id- 附件ID4.3 附件信息获取4.3.1 attach_size() - 获取附件大小attach_size($attach_id)功能获取附件大小参数$attach_id- 附件ID返回值文件大小字节示例$size attach_size(123456); echo 文件大小 . format_size($size);4.3.2 attach_real_path() - 获取附件真实路径attach_real_path($attach_id)功能获取附件在服务器上的真实路径参数$attach_id- 附件ID返回值文件绝对路径示例$path attach_real_path(123456); echo 文件路径$path;4.3.3 attach_url() - 获取附件访问URLattach_url($attach_id, $inline false)功能获取附件的访问URL参数说明参数类型说明attach_idstring附件IDinlinebool是否在线预览true预览false下载返回值附件URL示例// 获取下载链接 $download_url attach_url(123456); // 获取预览链接 $preview_url attach_url(123456, true);4.3.4 attach_link() - 获取附件链接attach_link($attach_id, $text , $inline false)功能生成完整的附件链接HTML参数说明参数类型说明attach_idstring附件IDtextstring链接文字默认文件名inlinebool是否在线预览返回值HTML链接代码示例echo attach_link(123456, _(点击下载));4.4 附件操作4.4.1 copy_attach() - 复制附件copy_attach($attach_id, $new_module , $new_record_id 0)功能复制附件到新位置参数说明参数类型说明attach_idstring附件IDnew_modulestring新模块名称new_record_idint新记录ID返回值新附件ID示例$new_attach_id copy_attach(123456, project, 2);4.4.2 attach_sign_key() - 生成附件签名attach_sign_key($attach_id)功能生成附件访问签名参数$attach_id- 附件ID返回值签名字符串用途用于生成安全的附件访问链接示例$sign attach_sign_key(123456); $url download.php?id123456sign$sign;4.4.3 attach_id_encode() / attach_id_decode() - ID编解码// 编码 $encoded_id attach_id_encode($raw_id); // 解码 $raw_id attach_id_decode($encoded_id);功能附件ID的加密和解密参数$raw_id/$encoded_id- 原始ID或编码后的ID用途防止附件ID被猜测五、文件类型判断函数5.1 文件类型检测5.1.1 is_uploadable() - 是否可上传is_uploadable($filename)功能判断文件是否允许上传参数$filename- 文件名返回值true或false5.1.2 is_text() - 是否为文本文件is_text($filename)功能判断文件是否为文本文件参数$filename- 文件名返回值true或false5.1.3 is_office() - 是否为Office文件is_office($filename)功能判断文件是否为Office文件参数$filename- 文件名返回值true或false支持格式doc, docx, xls, xlsx, ppt, pptx, pdf等5.1.4 is_image() - 是否为图片文件is_image($filename)功能判断文件是否为图片文件参数$filename- 文件名返回值true或false支持格式jpg, jpeg, png, gif, bmp等5.1.5 is_viewable() - 是否可在线预览is_viewable($filename)功能判断文件是否支持在线预览参数$filename- 文件名返回值true或false支持格式图片、Office文档、PDF等5.1.6 is_media() - 是否为媒体文件is_media($filename)功能判断文件是否为媒体文件参数$filename- 文件名返回值true或false支持格式mp3, mp4, avi, flv等5.1.7 is_editable() - 是否可编辑is_editable($filename)功能判断文件是否支持在线编辑参数$filename- 文件名返回值true或false5.1.8 is_wps() - 是否为WPS文件is_wps($filename)功能判断文件是否为WPS格式参数$filename- 文件名返回值true或false5.2 文件类型判断流程图六、图片处理函数6.1 CreateThumb() - 创建缩略图CreateThumb($src_file, $dst_file, $max_width, $max_height)功能创建图片缩略图参数说明参数类型说明src_filestring源文件路径dst_filestring目标文件路径max_widthint最大宽度max_heightint最大高度返回值true或false示例CreateThumb( attach/project/202401/image.jpg, attach/project/202401/image_thumb.jpg, 200, 200 );6.2 image_mimetype() - 获取图片MIME类型image_mimetype($filename)功能获取图片的MIME类型参数$filename- 文件名返回值MIME类型字符串示例$mime image_mimetype(image.jpg); echo MIME类型$mime; // 输出image/jpeg6.3 ReplaceImageSrc() - 替换图片路径ReplaceImageSrc($html, $module, $record_id)功能替换HTML内容中的图片路径为附件URL参数说明参数类型说明htmlstringHTML内容modulestring模块名称record_idint记录ID返回值处理后的HTML示例$content img srcimage.jpg; $content ReplaceImageSrc($content, project, 1); // 输出img src/attach/project/202401/image.jpg七、文件操作函数7.1 目录操作7.1.1 dir_size() - 计算目录大小dir_size($dir)功能计算目录占用空间大小参数$dir- 目录路径返回值目录大小字节示例$size dir_size(attach/project); echo 目录大小 . format_size($size);7.1.2 delete_dir() - 删除目录delete_dir($dir)功能删除目录及其所有内容参数$dir- 目录路径返回值true或false7.1.3 dir_file_nums() - 统计目录文件数dir_file_nums($dir)功能统计目录中的文件数量参数$dir- 目录路径返回值文件数量7.2 文件操作7.2.1 backup_file() - 备份文件backup_file($src_file, $dst_file)功能备份文件参数说明参数类型说明src_filestring源文件路径dst_filestring目标文件路径返回值true或false7.2.2 td_copy() - 文件复制td_copy($src_file, $dst_file)功能复制文件参数说明参数类型说明src_filestring源文件路径dst_filestring目标文件路径返回值true或false7.2.3 td_rename() - 文件重命名td_rename($old_name, $new_name)功能重命名文件参数说明参数类型说明old_namestring旧文件名new_namestring新文件名返回值true或false7.2.4 td_file_put_contents() - 写入文件td_file_put_contents($file, $content)功能写入文件内容参数说明参数类型说明filestring文件路径contentstring文件内容返回值写入的字节数或false八、附件处理实战8.1 完整的附件上传示例?php include_once(inc/auth.inc.php); include_once(inc/header.inc.php); include_once(inc/utility_file.php); if ($_POST) { $attach_ids array(); // 处理文件上传 if ($_FILES[attachments][name][0]) { foreach ($_FILES[attachments][name] as $key $name) { // 临时修改$_FILES结构 $temp_file array( name $_FILES[attachments][name][$key], type $_FILES[attachments][type][$key], tmp_name $_FILES[attachments][tmp_name][$key], error $_FILES[attachments][error][$key], size $_FILES[attachments][size][$key] ); $_FILES[attachment] $temp_file; $result upload(attachment, , 20480, project); if ($result[error] 0) { $attach_ids[] $result[id]; } } } // 保存到数据库 if (!empty($attach_ids)) { $attach_id_str implode(,, $attach_ids); $td-query(INSERT INTO project_attach (project_id, attach_ids) VALUES (1, $attach_id_str)); } Message(_(上传成功), index.php, success); exit; } ? form methodpost enctypemultipart/form-data input typefile nameattachments multiple button typesubmit?php echo _(上传附件); ?/button /form ?php include_once(inc/footer.inc.php); ?8.2 附件列表展示示例?php include_once(inc/auth.inc.php); include_once(inc/header.inc.php); include_once(inc/utility_file.php); // 获取附件列表 $result $td-query(SELECT attach_ids FROM project WHERE project_id 1); $row $td-fetch_array($result); $attach_ids explode(,, $row[attach_ids]); ? div classattach-list h3?php echo _(附件列表); ?/h3 ?php foreach ($attach_ids as $attach_id) { ? div classattach-item ?php echo attach_link($attach_id); ? span classsize(?php echo format_size(attach_size($attach_id)); ?)/span a hrefdelete_attach.php?id?php echo $attach_id; ? onclickreturn confirm(?php echo _(确定删除?); ?) ?php echo _(删除); ? /a /div ?php } ? /div ?php include_once(inc/footer.inc.php); ?8.3 附件权限控制?php include_once(inc/auth.inc.php); // 检查附件权限 function check_attach_permission($attach_id, $uid) { global $td; // 查询附件所属记录 $sql SELECT * FROM project_attach WHERE attach_ids LIKE %$attach_id%; $result $td-query($sql); if ($td-num_rows($result) 0) { $row $td-fetch_array($result); // 检查项目权限 $project_result $td-query(SELECT creator_uid FROM project WHERE project_id . $row[project_id]); $project_row $td-fetch_array($project_result); if ($project_row[creator_uid] $uid || is_module_manager($uid, project)) { return true; } } return false; } // 使用示例 $attach_id $_GET[id]; if (!check_attach_permission($attach_id, $_SESSION[uid])) { Message(_(无权限访问该附件), , error); exit; } // 允许访问附件 $path attach_real_path($attach_id); // 输出文件内容 ?九、最佳实践9.1 安全注意事项安全建议安全项建议文件类型使用白名单机制只允许上传已知安全的文件类型文件大小设置合理的大小限制防止DoS攻击文件名过滤特殊字符避免路径遍历攻击权限控制验证用户是否有权限访问附件文件归属检查附件是否属于用户有权访问的记录9.2 性能优化优化建议优化项建议存储结构按模块和日期分目录存储便于管理和清理缓存策略缓存附件元数据减少数据库查询CDN加速使用CDN加速附件下载文件压缩对图片和文档进行压缩处理清理策略定期清理过期或无用的附件9.3 备份策略备份建议备份项说明数据库备份附件表和关联业务表文件系统备份MYOA\attach目录增量备份只备份新增和修改的文件恢复测试定期测试备份文件的可用性十、常见问题10.1 上传失败现象文件上传失败返回错误码解决方案错误码说明错误码原因解决方案1文件大小超过PHP配置限制修改php.ini中的upload_max_filesize2文件类型不在白名单修改allow_types参数3服务器磁盘空间不足清理磁盘空间4临时目录无写入权限检查临时目录权限10.2 附件无法下载现象点击附件链接无法下载解决方案问题类型排查方法附件ID错误检查attach_id是否正确文件已删除检查文件是否存在于attach目录权限不足检查用户权限路径错误使用attach_real_path()验证路径10.3 附件预览异常现象Office文件无法在线预览解决方案问题类型排查方法OC服务未启动检查Office_OC服务状态文件格式不支持检查是否为支持的格式文件损坏验证文件完整性内存不足增加MemoryMax配置

相关新闻

图论算法之深度遍历岛屿问题

图论算法之深度遍历岛屿问题

200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int numIslands(char[][] grid) {int res 0;for(int r 0; r< grid.length; r){for(int c 0; c<grid[0].length; c){if(grid[r][c] 1){res;dfs(grid, r,c);}}}return res;}//从岛屿位置…

2026/7/6 3:07:59 阅读更多 →
Lemos:动态知识网络新范式

Lemos:动态知识网络新范式

Ima 与 Lemos 在知识组织方式上的本质区别在于&#xff0c;Ima 追求精确、静态、可推理的知识结构&#xff0c;而 Lemos 则致力于构建动态、关联、可生长的智能知识网络。Lemos 的核心优势在于其“AI知识图谱”双引擎驱动的范式&#xff0c;将知识库从被动的存储中心转变为主动…

2026/7/6 3:07:58 阅读更多 →
AI智能伴侣开发实战:从零构建你的专属聊天机器人

AI智能伴侣开发实战:从零构建你的专属聊天机器人

一、引言&#xff1a;当AI走进生活 在2026年的今天&#xff0c;人工智能早已不再是科幻电影中的遥远概念。从ChatGPT到DeepSeek&#xff0c;从Gemini到Qwen&#xff0c;大语言模型正以前所未有的速度改变着我们与计算机交互的方式。然而&#xff0c;对于大多数开发者而言&…

2026/7/6 2:59:57 阅读更多 →

最新新闻

PowerShell 路径规则详解:从基础到高级

PowerShell 路径规则详解:从基础到高级

1. 引言在 Windows 系统管理和自动化脚本编写中&#xff0c;PowerShell 是功能强大的工具。无论是访问文件、加载模块&#xff0c;还是执行脚本&#xff0c;都离不开对路径的正确理解和处理。PowerShell 的路径规则与传统的 CMD 有所不同&#xff0c;它更灵活&#xff0c;但也更…

2026/7/6 3:56:12 阅读更多 →
你的前端代码打包后究竟经历了什么?

你的前端代码打包后究竟经历了什么?

打包命令执行的一瞬间&#xff0c;构建工具并不会立刻编译代码&#xff0c;第一步永远是读取并整合所有配置规则。构建工具配置读取&#xff1a; 以 Vite 为例&#xff0c;工具会自动查找项目根目录 vite.config.js&#xff0c;读取入口文件、输出目录、打包策略、公共路径等核…

2026/7/6 3:50:11 阅读更多 →
[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

本次需要通过TI的TL2518芯片进行ADC采样。该芯片为SPI接口&#xff0c;具有八个通道&#xff0c;可以全部配置成AIN进行采样&#xff0c;本次需要探究如何该如何配置才能将芯片的采样率达到最大。1.TLA2158首先要陈列一下该芯片的一些特性&#xff0c;为节省篇幅&#xff0c;此…

2026/7/6 3:48:11 阅读更多 →
【全文系列目录】风控PM记

【全文系列目录】风控PM记

风控PM记 一&#xff1a;风险认知与识别&#xff08;入门篇&#xff09; ① 入门第一课&#xff1a;认识风险&#xff0c;了解风控 ② 入门第二课&#xff1a;业务催生风险&#xff0c;常见的业务风险有哪些&#xff1f; ③ 《电商风控入门&#xff1a;我们到底在“防”什…

2026/7/6 3:48:11 阅读更多 →
基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 如果你正在考虑将AI Agent引入企业生产环境&#xff0c;可能会面临这样的困境&#xff1a;在本地开发环境中跑得飞快的Agent原型&…

2026/7/6 3:42:09 阅读更多 →
飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

背景 团队每日通过飞书推送项目晨报和日报&#xff0c;内容从项目管理平台实时拉取&#xff0c;包含任务统计、进度列表、风险项等多维数据&#xff0c;天然需要表格来承载。 最初的实现方案是飞书消息推送 纯文本&#xff0c;格式简陋&#xff0c;阅读体验差。于是决定升级为…

2026/7/6 3:40:09 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻