镖师 发表于 2022-1-25 16:28:49

附件4G以上显示异常

上传附件后,小于4G的附件帖子可以正常显示大小,大于4G以上(5.21G、6.3G、7G、8、9。。)通通只显示4G,这个怎么能让附件大小正常显示呢?谢谢!

独家记忆 发表于 2022-1-25 16:29:14

pre_forum_attachment_X 表 filesize 字段最大支持 4294967295 Bytes 文件,超出会截断。
@专家 是否考虑扩容字段?

Discuz智能体 发表于 2025-3-19 19:13:52

这个问题通常是由于PHP的整数类型限制导致的。在32位系统上,PHP的整数类型最大只能表示2^31-1(即2147483647),而在64位系统上,PHP的整数类型最大可以表示2^63-1。然而,即使是在64位系统上,PHP的某些函数在处理大文件时仍然可能会受到限制。

### 解决方案:

1. **检查PHP配置**:
   - 确保你的PHP版本是64位的,并且运行在64位的操作系统上。
   - 检查`php.ini`文件中的`upload_max_filesize`和`post_max_size`配置项,确保它们足够大以支持上传大文件。例如:
   upload_max_filesize = 10G
   post_max_size = 10G
   - 确保`memory_limit`也足够大,以处理大文件的上传和操作。

2. **修改Discuz代码**:
   - 打开`source/class/class_upload.php`文件,找到处理文件大小的部分代码。
   - 修改文件大小计算的逻辑,确保它能够正确处理大于4G的文件。例如:
   $filesize = filesize($file['tmp_name']);
   if ($filesize > 4294967296) {
         // 处理大于4G的文件大小
         $filesize = sprintf("%u", $filesize);
   }
   - 这样修改后,文件大小将以无符号整数形式存储,避免溢出问题。

3. **数据库字段类型**:
   - 检查数据库中存储附件大小的字段类型,确保它是`BIGINT`类型,而不是`INT`类型。`INT`类型的最大值是2147483647,而`BIGINT`类型的最大值是9223372036854775807,足以存储大于4G的文件大小。
   - 如果需要修改数据库字段类型,可以使用以下SQL语句:
   ALTER TABLE `pre_forum_attachment` MODIFY `filesize` BIGINT UNSIGNED NOT NULL;

4. **前端显示**:
   - 在前端显示文件大小时,确保JavaScript或PHP代码能够正确处理大于4G的文件大小。可以使用类似以下的代码来格式化文件大小:
   function formatSizeUnits($bytes) {
         if ($bytes >= 1073741824) {
             $bytes = number_format($bytes / 1073741824, 2) . ' GB';
         } elseif ($bytes >= 1048576) {
             $bytes = number_format($bytes / 1048576, 2) . ' MB';
         } elseif ($bytes >= 1024) {
             $bytes = number_format($bytes / 1024, 2) . ' KB';
         } elseif ($bytes > 1) {
             $bytes = $bytes . ' bytes';
         } elseif ($bytes == 1) {
             $bytes = $bytes . ' byte';
         } else {
             $bytes = '0 bytes';
         }
         return $bytes;
   }

### 总结:
通过以上步骤,你应该能够解决Discuz中大于4G附件显示异常的问题。如果问题仍然存在,建议进一步检查服务器环境和代码逻辑,确保所有环节都支持大文件处理。

如果你有其他问题或需要进一步的帮助,请随时联系我!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 附件4G以上显示异常