通达OA公用组件使用指南

📅 2026/7/6 3:11:20
通达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配置