xiao9469 发表于 2023-9-2 20:00:45

社区附件命名规则【按附件id存放】

能否让附件名字:按附件id存放,便于管理?求教。
我知道答案 回答被采纳将会获得1 贡献 已有0人回答

Discuz智能体 发表于 2025-3-20 08:23:13

在Discuz中,附件的默认命名规则是基于时间戳和随机字符串生成的,这样可以避免文件名冲突。如果你希望将附件按照附件ID来命名,便于管理,可以通过修改Discuz的源代码来实现。

### 实现步骤:

1. **找到附件上传的代码**:
   附件上传的代码通常位于 `source/class/class_upload.php` 文件中。你需要找到处理附件上传和命名的部分。

2. **修改附件命名规则**:
   在 `class_upload.php` 文件中,找到 `save_to_local` 方法。这个方法负责将上传的文件保存到服务器上。你可以修改文件的命名规则,使其基于附件ID。

   例如,找到以下代码:
   $filename = $this->get_target_filename($attach['attachment'], $attach['filename']);

   将其修改为:
   $filename = $attach['aid'] . '.' . $this->fileext($attach['filename']);

   这样,附件的文件名将基于附件ID生成。

3. **确保附件ID可用**:
   在保存附件之前,附件ID可能还没有生成。因此,你可能需要在保存附件之前先插入一条记录到数据库中,获取附件ID,然后再使用这个ID来命名文件。

   你可以在 `source/module/forum/forum_upload.php` 中找到插入附件的代码,并在保存文件之前获取附件ID。

4. **更新数据库记录**:
   在保存文件后,确保数据库中的附件记录与文件名一致。通常,附件信息会存储在 `pre_forum_attachment` 表中,你需要确保 `filename` 字段与实际的文件名一致。

### 注意事项:
- **备份**:在修改代码之前,务必备份你的网站和数据库,以防止出现不可预见的错误。
- **测试**:在生产环境中应用这些更改之前,建议在测试环境中进行充分的测试,确保一切正常。
- **兼容性**:修改核心代码可能会影响未来的升级,因此建议在升级时重新检查这些修改。

### 示例代码:
以下是一个简单的示例,展示如何修改 `class_upload.php` 文件中的 `save_to_local` 方法:

public function save_to_local($attach) {
    global $_G;

    $filename = $attach['aid'] . '.' . $this->fileext($attach['filename']);
    $filepath = $this->get_target_path($attach['attachment']);

    if (!is_dir($filepath)) {
      mkdir($filepath, 0777, true);
    }

    $target = $filepath . $filename;

    if (!move_uploaded_file($attach['tmp_name'], $target)) {
      return false;
    }

    return $filename;
}

在这个示例中,`$attach['aid']` 是附件ID,`$this->fileext($attach['filename'])` 获取文件扩展名。这样,附件的文件名将基于附件ID生成。

### 总结:
通过修改Discuz的源代码,你可以实现附件按照附件ID命名的功能。这有助于更好地管理和查找附件。不过,修改核心代码需要谨慎操作,确保不会影响系统的稳定性和未来的升级。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 社区附件命名规则【按附件id存放】