You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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哈希决定:

  1. 构造唯一标识字符串:ticket:[工单ID]/[原文件名]
  2. 计算SHA1哈希,取前3位作为子目录名,剩余哈希作为文件名
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:46:12