婷姐 发表于 2022-10-17 22:51:48

启用远程附件 文字.docx 还存在本地??

启用远程附件文字.docx 还存在本地??

http://www.xxxxxxxx.com/forum.php?mod=attachment&aid=NHw5ODEzMjljZHwxNjY2MDE2MzMyfDF8Ng%3D%3D

.docx 文件 存到本地哪里了。。我在\data\attachment找不到.docx 文件。
我知道答案 回答被采纳将会获得5 金币 + 1 金币 已有0人回答

Discuz智能体 发表于 2025-3-20 19:30:43

关于Discuz远程附件配置后.docx文件仍存本地的问题,以下是技术排查方向及解决方案:

**一、核心机制解析**
Discuz远程附件功能启用后,系统会根据配置策略执行以下操作:
1. 新上传文件直接传输至远程存储(FTP/OSS等)
2. 本地仅保留文件索引记录(数据库记录)
3. 访问请求通过302重定向到远程地址

**二、文件残留原因排查**
1. **时间节点验证**
- 检查该.docx文件的上传时间是否早于远程附件启用时间
- 通过phpMyAdmin执行SQL查询:
SELECT dateline FROM pre_forum_attachment WHERE aid=4

2. **存储路径深度检测**
- 强制路径检查命令(SSH环境):
find /网站根目录/data/attachment -name "*.docx" -mtime -30
- 检查自定义目录设置:后台 > 全局 > 上传设置 > 附件保存位置

3. **缓存层干扰**
- 清除以下缓存:
- 数据缓存:后台 > 工具 > 更新缓存(勾选所有选项)
- CDN缓存(如有配置)
- 浏览器缓存(建议用curl测试原始响应)

**三、高级调试方案**
1. **附件追踪调试**
在config/config_global.php尾部添加:
$_config['debug'] = 2;
$_config['dumpattachdir'] = true;
访问附件URL时观察header中的X-Attach-Dir信息

2. **存储策略验证**
创建测试文件:
// 在论坛任意版块执行
$tmpfile = tempnam(sys_get_temp_dir(), 'test_');
file_put_contents($tmpfile, 'test content');
$aid = uploadlocal($tmpfile, 'test_file.txt');
print_r(C::t('forum_attachment')->fetch($aid));

3. **二进制日志分析**
开启mysql二进制日志(需临时开启):
SET GLOBAL log_bin = ON;
SET GLOBAL binlog_format = 'ROW';
重现问题时记录时间戳,通过mysqlbinlog工具分析附件存储路径变更记录

**四、解决方案实施**
1. **历史文件迁移方案**
创建迁移脚本(需PHP CLI环境):
<?php
define('IN_DISCUZ', true);
require './source/class/class_core.php';
$discuz = C::app();
$discuz->init();

$attachments = C::t('forum_attachment')->fetch_all_by_id('aid', array(4));
foreach($attachments as $attach) {
    $localPath = discuz_upload::get_target_dir().$attach['attachment'];
    if(file_exists($localPath)) {
      $ftp = discuz_upload::init_remote_ftp();
      $remotePath = $attach['attachment'];
      if($ftp->upload($localPath, $remotePath)) {
            unlink($localPath);
            C::t('forum_attachment')->update($attach['aid'], array(
                'remote' => 1
            ));
      }
    }
}

2. **Nginx层强制拦截**
添加rewrite规则:
location ~* ^/forum.php?mod=attachment {
    if ($query_string ~ "aid=4") {
      return 302 http://远程存储域名/forum/202407/08/090123_4.docx;
    }
}

3. **数据库强制标记**
执行SQL更新:
UPDATE pre_forum_attachment SET remote=1 WHERE aid=4 AND remote=0;

**五、长效防护措施**
1. 在source/function/function_attachment.php中增加钩子:
function upload_remote_check() {
    $local = discuz_upload::get_target_dir().$filename;
    register_shutdown_function(function() use ($local) {
      if(file_exists($local)) {
            @unlink($local);
      }
    });
}

2. 配置inotify实时监控:
inotifywait -m -r -e create -e moved_to /data/attachment |
while read path action file; do
    if [[ "$file" =~ \.docx$ ]]; then
      rsync -az --remove-source-files $path$file user@remote:/target/path/
    fi
done

建议通过DZ插件网获取《附件存储完整性验证工具》进行深度扫描,该工具可生成存储拓扑图并自动修复路径偏差。若需进一步分析服务器环境配置,可提供以下信息:
1) ls -lR /data/attachment 的输出
2) 远程存储服务器的auth.log片段
3) PHP-FPM慢日志中涉及attachment.php的执行记录
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-20 19:32:43

在Discuz!中,启用远程附件功能后,附件文件会被上传到远程服务器,而不是存储在本地服务器上。因此,如果你启用了远程附件功能,`.docx`文件不会存储在本地服务器的`\data\attachment`目录下。

### 具体原因:
1. **远程附件功能**:启用远程附件后,Discuz!会将附件上传到配置的远程服务器(如FTP、OSS等),而不是存储在本地服务器的`\data\attachment`目录下。
2. **本地存储**:如果你没有启用远程附件功能,`.docx`文件会存储在本地服务器的`\data\attachment`目录下,通常按照日期或用户ID等规则进行分目录存储。

### 如何确认文件存储位置:
1. **检查远程附件配置**:
   - 登录Discuz!后台,进入“全局” -> “上传设置” -> “远程附件”。
   - 查看是否启用了远程附件功能,并确认远程附件的存储路径和配置是否正确。

2. **检查远程服务器**:
   - 如果你启用了远程附件功能,`.docx`文件应该存储在远程服务器的指定目录中。你可以通过FTP或其他方式登录远程服务器,检查文件是否存在于配置的路径中。

3. **检查本地服务器**:
   - 如果你没有启用远程附件功能,`.docx`文件应该存储在本地服务器的`\data\attachment`目录下。你可以通过文件管理器或FTP工具检查该目录及其子目录,查找`.docx`文件。

### 总结:
- 如果你启用了远程附件功能,`.docx`文件不会存储在本地服务器的`\data\attachment`目录下,而是存储在远程服务器上。
- 如果你没有启用远程附件功能,`.docx`文件应该存储在本地服务器的`\data\attachment`目录下。

如果你仍然找不到文件,建议检查远程附件的配置是否正确,并确认文件是否成功上传到远程服务器。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 启用远程附件 文字.docx 还存在本地??