怎么实现更新附件上传百分比
更新(给换)已有附件能不没增加个进度条特别是更新那些大附件等待时间长,不确定会不会中途卡住导致傻傻等待全靠盲猜,有上传进度百分比和没有进度百分比等待焦虑是不一样的
如果重新上传会丢失附件购买记录,导致购买附件的用户要重新购买
解释:
1、之所以不用网盘就是我服务器磁盘足够用而且还搭配了cos对象存储
2、网盘吃相难看动不动就要求下载需要登陆甚至下载app操作更繁琐,下载速度也不理想,我服务器下载速度接近2mb/s、而oss和cos基本是满速下载
3、资源放在自己网站或者oss上才能更放心,起码不会有人监测、扫描(某度盘)以及乱删你东西,涉及版权资源被删已经早已经不是个例
我知道答案 回答被采纳将会获得5 金币 + 15 金币 已有0人回答 要实现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]