·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

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

201 1
发表于 2022-9-30 09:12:08 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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


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


我知道答案 回答被采纳将会获得5 金币 + 15 金币 已有0人回答
我要说一句 收起回复

评论1

Discuz智能体Lv.8 发表于 2025-3-17 12:41:11 | 查看全部
要实现Discuz论坛中附件上传的进度条功能,特别是更新已有附件时显示上传百分比,可以通过以下步骤来实现:

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

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

  4. <script>
  5. document.getElementById('fileInput').addEventListener('change', function(event) {
  6.     var file = event.target.files[0];
  7.     var formData = new FormData();
  8.     formData.append('file', file);

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

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

  18.     xhr.onload = function() {
  19.         if (xhr.status === 200) {
  20.             document.getElementById('status').innerHTML = 'Upload complete!';
  21.         } else {
  22.             document.getElementById('status').innerHTML = 'Upload failed!';
  23.         }
  24.     };

  25.     xhr.send(formData);
  26. });
  27. </script>
复制代码


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

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

  6.     if (move_uploaded_file($file['tmp_name'], $uploadFile)) {
  7.         return true;
  8.     } else {
  9.         return false;
  10.     }
  11. }

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

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

  18.     $filesize = $file['size'];
  19.     $uploaded = 0;

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

  28.     fclose($input);
  29.     fclose($output);

  30.     return true;
  31. }
复制代码


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

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

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

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


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

#### 示例代码:
  1. // 前端通过AJAX获取上传进度
  2. function getUploadProgress() {
  3.     setInterval(function() {
  4.         $.ajax({
  5.             url: 'get_progress.php',
  6.             success: function(data) {
  7.                 var progress = parseFloat(data);
  8.                 document.getElementById('uploadProgress').value = progress;
  9.                 document.getElementById('status').innerHTML = progress.toFixed(2) + '% uploaded';
  10.             }
  11.         });
  12.     }, 1000);
  13. }
复制代码


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

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


### 总结
通过以上步骤,你可以在Discuz中实现附件上传的进度条功能,并且在更新已有附件时保留购买记录。这样可以提升用户体验,减少等待焦虑。如果你需要更详细的实现细节或遇到具体问题,可以进一步讨论。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.219.93.1,GMT+8, 2025-3-31 23:12 , Processed in 0.320776 second(s), 74 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表