婷姐 发表于 2022-9-30 09:12:08

怎么实现更新附件上传百分比

更新(给换)已有附件能不没增加个进度条
特别是更新那些大附件等待时间长,不确定会不会中途卡住导致傻傻等待全靠盲猜,有上传进度百分比和没有进度百分比等待焦虑是不一样的


如果重新上传会丢失附件购买记录,导致购买附件的用户要重新购买



解释:
1、之所以不用网盘就是我服务器磁盘足够用而且还搭配了cos对象存储
2、网盘吃相难看动不动就要求下载需要登陆甚至下载app操作更繁琐,下载速度也不理想,我服务器下载速度接近2mb/s、而oss和cos基本是满速下载
3、资源放在自己网站或者oss上才能更放心,起码不会有人监测、扫描(某度盘)以及乱删你东西,涉及版权资源被删已经早已经不是个例


我知道答案 回答被采纳将会获得5 金币 + 15 金币 已有0人回答

Discuz智能体 发表于 2025-3-17 12:41:11

要实现Discuz论坛中附件上传的进度条功能,特别是更新已有附件时显示上传百分比,可以通过以下步骤来实现:

### 1. 修改前端上传组件
首先,你需要在前端修改上传组件,使其支持上传进度的显示。可以使用HTML5的`<input type="file">`元素,并结合JavaScript的`XMLHttpRequest`或`fetch` API来实现上传进度的监控。

#### 示例代码:
<input type="file" id="fileInput" />
<progress id="uploadProgress" value="0" max="100"></progress>
<div id="status"></div>

<script>
document.getElementById('fileInput').addEventListener('change', function(event) {
    var file = event.target.files;
    var formData = new FormData();
    formData.append('file', file);

    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'upload.php', true);

    xhr.upload.onprogress = function(e) {
      if (e.lengthComputable) {
            var percentComplete = (e.loaded / e.total) * 100;
            document.getElementById('uploadProgress').value = percentComplete;
            document.getElementById('status').innerHTML = percentComplete.toFixed(2) + '% uploaded';
      }
    };

    xhr.onload = function() {
      if (xhr.status === 200) {
            document.getElementById('status').innerHTML = 'Upload complete!';
      } else {
            document.getElementById('status').innerHTML = 'Upload failed!';
      }
    };

    xhr.send(formData);
});
</script>

### 2. 修改Discuz的上传逻辑
Discuz的上传逻辑主要在`source/class/class_upload.php`文件中。你需要在这个文件中找到处理文件上传的部分,并添加进度监控的逻辑。

#### 示例代码:
// 在class_upload.php中找到文件上传的部分
// 假设你已经有了一个处理上传的函数
function uploadFile($file) {
    $uploadPath = 'path/to/upload/directory/';
    $uploadFile = $uploadPath . basename($file['name']);

    if (move_uploaded_file($file['tmp_name'], $uploadFile)) {
      return true;
    } else {
      return false;
    }
}

// 修改为支持进度监控的上传
function uploadFileWithProgress($file) {
    $uploadPath = 'path/to/upload/directory/';
    $uploadFile = $uploadPath . basename($file['name']);

    $input = fopen($file['tmp_name'], 'r');
    $output = fopen($uploadFile, 'w');

    $filesize = $file['size'];
    $uploaded = 0;

    while (!feof($input)) {
      $buffer = fread($input, 8192);
      fwrite($output, $buffer);
      $uploaded += strlen($buffer);
      $progress = ($uploaded / $filesize) * 100;
      // 这里可以将进度信息发送到前端
      // 例如通过AJAX或WebSocket
    }

    fclose($input);
    fclose($output);

    return true;
}

### 3. 更新已有附件
为了避免重新上传附件导致购买记录丢失,你可以在更新附件时保留原有的附件ID和购买记录。具体来说,你可以在数据库中更新附件的文件路径,而不是删除并重新插入一条记录。

#### 示例代码:
// 假设你已经有了附件的ID
$attachmentId = $_POST['attachment_id'];
$newFile = $_FILES['new_file'];

// 更新附件文件
$uploadPath = 'path/to/upload/directory/';
$newFilePath = $uploadPath . basename($newFile['name']);

if (move_uploaded_file($newFile['tmp_name'], $newFilePath)) {
    // 更新数据库中的附件路径
    DB::query("UPDATE ".DB::table('forum_attachment')." SET filename = '$newFilePath' WHERE aid = '$attachmentId'");
    echo 'Attachment updated successfully!';
} else {
    echo 'Failed to update attachment!';
}

### 4. 前端与后端通信
为了实时更新上传进度,你可以使用AJAX或WebSocket将上传进度信息发送到前端。前端可以根据接收到的进度信息更新进度条。

#### 示例代码:
// 前端通过AJAX获取上传进度
function getUploadProgress() {
    setInterval(function() {
      $.ajax({
            url: 'get_progress.php',
            success: function(data) {
                var progress = parseFloat(data);
                document.getElementById('uploadProgress').value = progress;
                document.getElementById('status').innerHTML = progress.toFixed(2) + '% uploaded';
            }
      });
    }, 1000);
}

### 5. 后端获取上传进度
在后端,你可以通过`session`或其他方式存储上传进度,并在前端请求时返回。

#### 示例代码:
// get_progress.php
session_start();
echo $_SESSION['upload_progress'];

### 总结
通过以上步骤,你可以在Discuz中实现附件上传的进度条功能,并且在更新已有附件时保留购买记录。这样可以提升用户体验,减少等待焦虑。如果你需要更详细的实现细节或遇到具体问题,可以进一步讨论。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 怎么实现更新附件上传百分比 15金币