如何通过PHP脚本直接访问TRAC问题跟踪系统的附件?
高效通过PHP访问TRAC附件的方案
方案1:改进TRAC内置导出命令(最快最稳妥)
TRAC自带的trac-admin导出命令比自定义脚本更可靠,之前的脚本变慢或失效大概率是权限、环境路径问题。直接用批量导出命令把所有工单附件导出到指定目录,PHP即可直接访问:
# 语法:trac-admin <TRAC环境路径> attachment export <类型(比如ticket)> <导出目录> trac-admin /var/www/trac/env attachment export ticket /var/www/trac-attachments-export
执行后,导出目录会自动生成ticket/[工单ID]/[原文件名]的结构,PHP直接读取该目录文件即可,无需处理哈希逻辑。
方案2:PHP直接计算TRAC附件存储路径
如果不想提前导出,可通过TRAC的哈希规则直接定位文件:
TRAC附件的存储路径由工单ID+文件名的唯一标识生成SHA1哈希决定:
- 构造唯一标识字符串:
ticket:[工单ID]/[原文件名] - 计算SHA1哈希,取前3位作为子目录名,剩余哈希作为文件名
- 拼接路径:
TRAC根目录/files/attachments/ticket/[前3位哈希]/[剩余哈希]
PHP实现代码:
<?php // 配置TRAC附件根路径 $tracAttachRoot = '/path/to/your/trac/files/attachments/ticket/'; // 从TRAC数据库获取的工单ID和附件原文件名 $ticketId = 12345; $originalFilename = 'somerandomfile.txt'; // 生成TRAC用于计算哈希的唯一键 $uniqueKey = "ticket:$ticketId/$originalFilename"; $fileHash = sha1($uniqueKey); // 拼接完整文件路径 $subDir = substr($fileHash, 0, 3); $fullFilePath = $tracAttachRoot . $subDir . '/' . $fileHash; // 输出文件给用户 if (file_exists($fullFilePath)) { $mime = mime_content_type($fullFilePath); header("Content-Type: $mime"); // 如需下载而非在线预览,把inline改成attachment header("Content-Disposition: inline; filename=\"$originalFilename\""); readfile($fullFilePath); } else { http_response_code(404); echo "附件不存在"; } ?>
注意事项
- 确保PHP进程对TRAC附件存储目录有读取权限
- 若TRAC版本较旧,哈希规则可能为MD5,可通过已知附件的哈希值验证调整
- 同一工单下同名附件多次上传会生成不同哈希,需从TRAC的
attachment表取最新记录(按time字段排序)
内容的提问来源于stack exchange,提问作者a coder
相关产品推荐
相关产品推荐

