webuploader分片上传示例,服务端上传文件到腾讯云CDN Teo 应用示例

本文环境:php7.3.4 CI3.0框架

一、大概步骤:

(1)利用百度的webuploader插件,将大文件分片上传的自己的服务器

(2)利用腾讯云接口从本服务器上传到腾讯云

二、详细代码:

1、进入前端页面的控制器

upload.php 从packageupload函数进入Html页面

class Upload {// 进入上传母包页面function packageupload(){$data['appid']=$this->input->get('appid', TRUE);// $data['appid']='iostt';if (!empty($data['appid'])) {$data['game_info'] = $this->mapp->getApp($data['appid']);$this->load->view("bapp/upload_form",$data);}else{echo '<script>alert("参数错误");</script>';}}// 前端分片上传包体 组合完成再统一上传(服务端到CDN传送文件)function upload_appid_package() {// 禁用输出缓冲区,确保响应立即发送if (ob_get_level()) {ob_end_clean();}header('Content-Type: application/json'); // 在函数开头设置 JSON 头部$appid = $this->input->post('appid');if (empty($appid)) {echo json_encode(['code' => 400, 'error' => 'App ID is required.']);exit;}$file = $_FILES['userfile'];$chunk = $this->input->post('chunk', TRUE); // 当前分片索引$chunks = $this->input->post('chunks', TRUE); // 总分片数$fileName = $this->input->post('name', TRUE); // 原始文件名$uniqueId = $this->input->post('uniqueId', TRUE); // 文件唯一标识if (!$fileName || !$uniqueId) {echo json_encode(['code' => 400, 'error' => 'Invalid file or unique ID.']);exit;}//临时存放的服务器文件夹 确保有存放权限$tmpDir = FCPATH . 'uploads/tmp/' . $uniqueId . '/';if (!is_dir($tmpDir)) {mkdir($tmpDir, 0777, TRUE);}$chunkPath = $tmpDir . $chunk;if (!move_uploaded_file($file['tmp_name'], $chunkPath)) {echo json_encode(['code' => 400, 'error' => 'Failed to save chunk.']);exit;}// 为每个分片返回成功响应// echo json_encode(['code' => 200, 'msg' => '分片上传成功', 'chunk' => $chunk]);// 处理最后一个分片并合并if ($chunk == $chunks - 1) {$finalPath = FCPATH . 'uploads/' . uniqid() . '_' . $fileName;$out = @fopen($finalPath, 'wb');if (!$out) {echo json_encode(['code' => 400, 'error' => '无法创建最终文件']);exit;}// 合并分片for ($i = 0; $i < $chunks; $i++) {$chunkFile = $tmpDir . $i;$in = @fopen($chunkFile, 'rb');if ($in) {while ($buff = fread($in, 8192)) {fwrite($out, $buff);}fclose($in);}}fclose($out);$game_info = $this->mapp->getApp($appid);if (empty($game_info)) {echo json_encode(['code' => 400, 'data' => null, 'msg' => '游戏不存在']);exit;}$extension = pathinfo($fileName, PATHINFO_EXTENSION);$version = !empty($game_info['version']) ? number_format($game_info['version'] + 0.1, 1) : '1.0';$cpid=$game_info['cpid'];$cos_path = 'test/' . $cpid . '/' . $cpid . '_' . $version . '.' . $extension;if ($game_info['plat'] == 1) {				$cos_path = 'package/ios/' . $cpid . '/' . $cpid . '_' . $version . '.' . $extension;}// 腾讯云上传$ten=new TencentCosUploader();$result = $ten->uploadFileFromPath($finalPath, $cos_path);log_message('error', json_encode($result, JSON_UNESCAPED_UNICODE));if (!empty($result['status'])) {//处理成功之后的逻辑// 清理临时目录$this->cleanDirectory();echo json_encode(['code' => 0, 'data' => 'success', 'msg' => '上传成功']);exit;} else {// 删除合并后的文件if (file_exists($finalPath)) {unlink($finalPath);}// 清理临时目录$this->cleanDirectory();echo json_encode(['code' => 400, 'data' => $result['error'], 'msg' => '上传失败']);exit;}}}// 清空临时文件夹public function cleanDirectory() {// 使用默认路径如果未指定$dir = rtrim($dir ?: FCPATH . 'uploads/tmp', DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;// 记录开始清理log_message('info', '开始清空临时目录: ' . $dir);// 检查目录是否存在if (!is_dir($dir)) {log_message('error', '临时目录不存在: ' . $dir);return true;}try {// 打开目录$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),RecursiveIteratorIterator::CHILD_FIRST);$success = true;// 遍历目录foreach ($iterator as $item) {$path = $item->getPathname();if ($item->isDir()) {// 删除空目录if (@rmdir($path) === false) {log_message('error', '无法删除目录: ' . $path);$success = false;}} else {// 删除文件if (@unlink($path) === false) {log_message('error', '无法删除文件: ' . $path);$success = false;}}}log_message('info', '临时目录清理完成,状态: ' . ($success ? '成功' : '部分失败'));return $success;} catch (Exception $e) {log_message('error', '清理临时目录时发生异常: ' . $e->getMessage());return false;}	}//获取appid信息,比对version确定是否更新成功function getappidinfo(){$appid = $this->input->get("appid", true);$version = $this->input->get("version", true);$data = $this->mapp->getApp($appid);$res=['code'=>0,'data'=>$data['version'],'msg'=>'success'];if($data['version'] == $version){$res['code'] = 1;}echo json_encode($res);} 
}

2、前端代码:upload_form.html
请先下载webuploader相关插件:地址:https://github.com/fex-team/webuploader
这个兄弟也有源码:GitCode - 全球开发者的开源社区,开源代码托管平台

如果都嫌麻烦,也可以通过这个链接下载:https://download.csdn.net/download/weixin_45143733/91008568

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>File Upload to Tencent COS</title><!-- Bootstrap CSS --><link href="/statics/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"><!-- WebUploader CSS --><link rel="stylesheet" type="text/css" href="/statics/js/plugins/ueditor/third-party/webuploader/webuploader.css" /><!-- jQuery --><script src="/statics/js/jquery-2.1.1.js"></script><script src="/assets/libs/fastadmin-layer/dist/layer.js"></script><style>body {background-color: #f8f9fa;}.upload-container {min-height: 100vh;display: flex;align-items: center;justify-content: center;}.upload-form {background-color: white;padding: 2rem;border-radius: 8px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);width: 100%;max-width: 500px;}.btn-upload {padding: 10px 20px;font-size: 1.1rem;}#picker {display: inline-block;}.progress-container {display: none;margin-top: 1rem;}.error-message {display: none;}</style>
</head>
<body><div class="upload-container"><div class="upload-form"><h3 class="text-center mb-4">上传母包</h3><div class="alert alert-danger error-message"></div><form id="uploadForm"><div class="mb-3"><label for="appid" class="form-label">Appid</label><input type="text" id="appid" name="appid" class="form-control" readonly value="<?php echo htmlspecialchars($game_info['appid']); ?>"></div>   <div class="mb-3"><label for="game_name" class="form-label">游戏名</label><input type="text" class="form-control" readonly value="<?php echo htmlspecialchars($game_info['name']); ?>"></div>    <div class="mb-3"><label for="userfile" class="form-label">现有版本号</label><input type="text" id="version" class="form-control" readonly value="<?php echo $game_info['version']?:'1.0'?>"></div>  <div class="mb-3" style="margin: 1rem;height: 5rem;"><div id="picker">选择文件上传</div></div><div class="d-flex align-items-center"><button type="button" id="uploadButton" class="btn btn-primary btn-upload" disabled>开始上传</button></div><div class="progress-container"><div class="progress"><div class="progress-bar" role="progressbar" style="width: 0%;" id="progressBar">0%</div></div></div></form></div></div><!-- Bootstrap JS --><script src="/statics/js/bootstrap.bundle.min.js"></script><!-- WebUploader JS --><script src="/statics/js/plugins/ueditor/third-party/webuploader/webuploader.js"></script><script>$(document).ready(function() {try {//console.log('Initializing WebUploader...');var uploader = WebUploader.create({auto: false,swf: '/statics/js/plugins/ueditor/third-party/webuploader/Uploader.swf',//处理分片合并的后端函数server: '<?php echo site_url('bapp/upload_appid_package'); ?>',pick: '#picker',chunked: true,chunkSize: 5 * 1024 * 1024, // 5MB 分片threads: 8,fileVal: 'userfile',formData: {appid: $('#appid').val()}});// 存储服务端返回数据// let serverResponses = [];//console.log('WebUploader initialized successfully');// 更新 appid$('#appid').on('change', function() {//console.log('Updating appid:', $(this).val());uploader.option('formData', {appid: $(this).val()});});// 文件选择前的校验uploader.on('beforeFileQueued', function(file) {var appid = $('#appid').val().toLowerCase();var isIos = appid.indexOf('ios') !== -1;var ext = file.ext.toLowerCase();if (isIos && ext !== 'ipa') {layer.msg('苹果包,请选择 .ipa 文件!', {icon: 5, shade: [0.3, '#393D49'], time: 1500});return false;} else if (!isIos && ext !== 'apk') {layer.msg('安卓包:请选择 .apk 文件!', {icon: 5, shade: [0.3, '#393D49'], time: 1500});return false;}return true;});// 文件选择后uploader.on('fileQueued', function(file) {console.log('File queued:', file.name);$('#uploadButton').prop('disabled', false);$('.webuploader-pick').text('已选择文件');// 更新 formData 以包含 uniqueId 和 nameuploader.option('formData', {appid: $('#appid').val(),uniqueId: file.uniqueId,name: file.name});});// 分片上传前,添加唯一标识uploader.on('beforeFileQueued', function(file) {//console.log('Generating unique ID for file:', file.name);file.uniqueId = WebUploader.Base.guid();});// 每个分片上传前,确保 formData 包含必要参数uploader.on('uploadBeforeSend', function(block, data) {//console.log('Sending chunk:', block.chunk, 'of', block.chunks);data.appid = $('#appid').val();data.uniqueId = block.file.uniqueId;data.name = block.file.name;});// 上传进度uploader.on('uploadProgress', function(file, percentage) {var percent = Math.round(percentage * 100);// //console.log('Upload progress:', percent + '%');$('#progressBar').css('width', percent + '%').text(percent + '%');$('.progress-container').show();});// 上传成功uploader.on('uploadSuccess', function(file, response) {              if (response && typeof response === 'object') {if (response.code === 0) {//这里的成功捕捉不太准确,建议在uploadComplete处理} else if (response.code === 200) {// 单个分片上传成功console.log('分片 ' + response.chunk + ' 上传成功');} else if (response.code ===400) {// 错误响应$('#uploadButton').prop('disabled', false).text('上传失败:'+response.msg);$('.progress-container').hide();$('.error-message').text('上传失败,重试中···').show();resetUploader();}} else {// 无效响应$('#uploadButton').prop('disabled', false).text('上传失败');$('.progress-container').hide();$('.error-message').text('服务器响应无效').show();resetUploader();}});// 上传错误uploader.on('uploadError', function(file, reason) {layer.msg('上传失败', {icon: 5, shade: [0.3, '#393D49'], time: 1500});$('.error-message').text('Upload failed: ' + reason).show();resetUploader();});// 上传完成uploader.on('uploadComplete', function(file, response) {    $.getJSON('<?php echo site_url('bapp/getappidinfo'); ?>', {appid: $('#appid').val(), version: $('#version').val()}, function(data) {if(data.code==0){var newversion='成功升级为:'+data.data;$('#version').val(newversion);// 上传成功layer.msg('上传成功', { icon: 6, shade: [0.3, '#393D49'], time: 2000 });$('.webuploader-pick').css('display', 'none');$('.error-message').css('display', 'none');// 最终上传成功$('#uploadButton').prop('disabled', true).text('上传成功');}else{// 错误响应$('#uploadButton').prop('disabled', false).text('上传失败');$('.progress-container').hide();$('.error-message').text('上传失败').show();}})                    $('#uploadButton').prop('disabled', true).text('上传完成');});// 开始上传$('#uploadButton').on('click', function() {//console.log('Upload button clicked');if (!uploader.getFiles().length) {$('.error-message').text('请选择文件.').show();console.warn('No file selected');return;}if (!$('#appid').val()) {$('.error-message').text('appid 未填写.').show();console.warn('No App ID provided');return;}$(this).prop('disabled', true).html('<span style="color:red">处理中,请勿关闭页面</span>');$('.error-message').hide();uploader.upload();});function resetUploader() {//console.log('Resetting uploader');$('#progressBar').css('width', '0%').text('');$('.progress-container').hide();uploader.reset();}} catch (e) {console.error('JavaScript error:', e.message, e.stack);$('.error-message').text('Initialization failed: ' + e.message).show();}});</script>
</body>
</html>

3、引用Teo接口上传前,请先安装腾讯云的插件

composer命令:composer require qcloud/cos-sdk-v5:^2.6

里面的参数请到腾讯云的管理后台去拿

Tencent.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');require_once APPPATH . 'libraries/third_party/vendor/autoload.php';use Qcloud\Cos\Client;class TencentCosUploader {private $CI;private $cosClient;private $config;public function __construct() {$this->CI =& get_instance();      $this->initializeCosClient();}/*** 统一配置腾讯云 COS 参数* @return array 配置数组*/private function getCosConfig() {return ['region' => '', // 存储桶地域,如 ap-guangzhou'schema' => 'http', // 协议头,http 或 https'credentials' => ['secretId' => '', // 腾讯云 Secret ID'secretKey' => '' // 腾讯云 Secret Key],'bucket' => '', // 存储桶名称,格式:BucketName-APPID'timeout' => 600, // 请求超时时间(秒)'connect_timeout' => 60 // 连接超时时间(秒)];}/*** 初始化 COS 客户端*/private function initializeCosClient() {$this->config = $this->getCosConfig();$this->cosClient = new Client(['region' => $this->config['region'],'schema' => $this->config['schema'],'credentials' => $this->config['credentials'],'timeout' => $this->config['timeout'],'connect_timeout' => $this->config['connect_timeout']]);}/*** 从本地路径上传文件到腾讯云 COS* @param string $local_file_path 本地文件路径* @param string $cos_path 文件在 COS 上的存储路径* @return array 上传结果*/public function uploadFileFromPath($local_file_path, $cos_path) {if (!file_exists($local_file_path)) {return ['status' => FALSE,'error' => 'Local file does not exist.'];}// 获取文件信息$file_name = basename($local_file_path);$extension = pathinfo($file_name, PATHINFO_EXTENSION);$extension = $extension ? strtolower($extension) : '';// 检查文件大小(3GB 限制)$file_size = filesize($local_file_path);if ($file_size > 3*1024 * 1024 * 1024) {return ['status' => FALSE,'error' => 'File size exceeds 1GB limit.'];}// 确保文件可写if (!is_writable($local_file_path)) {chmod($local_file_path, 0666);}try {// 根据文件大小选择上传方式$file_handle = fopen($local_file_path, 'rb');if ($file_size > 50 * 1024 * 1024) {$result = $this->cosClient->upload($this->config['bucket'],$cos_path,$file_handle,['PartSize' => 10 * 1024 * 1024]);} else {$result = $this->cosClient->putObject(['Bucket' => $this->config['bucket'],'Key' => $cos_path,'Body' => $file_handle]);}// 显式关闭文件句柄if (is_resource($file_handle)) {fclose($file_handle);}// 删除本地临时文件if (!unlink($local_file_path)) {log_message('error', 'Failed to delete local file: ' . $local_file_path . ' | Error: ' . error_get_last()['message']);}return ['status' => TRUE,'data' => ['file_name' => $file_name,'cos_path' => $cos_path,'url' => $result['Location'],'extension' => $extension,]];} catch (\Exception $e) {// 显式关闭文件句柄if (is_resource($file_handle)) {fclose($file_handle);}return ['status' => FALSE,'error' => 'COS Upload Failed: ' . $e->getMessage()];}}/*** 上传文件到腾讯云 COS* @param string $field_name 表单文件字段名* @param string $cos_path 文件在 COS 上的存储路径* @return array 上传结果*/public function uploadFile($field_name, $cos_path) {$upload_path = FCPATH . 'uploads/';// 确保上传目录存在if (!is_dir($upload_path)) {mkdir($upload_path, 0777, TRUE);}// 验证文件是否存在if (!isset($_FILES[$field_name]) || $_FILES[$field_name]['error'] === UPLOAD_ERR_NO_FILE) {return ['status' => FALSE,'error' => 'No file uploaded.'];}// 检查上传错误if ($_FILES[$field_name]['error'] !== UPLOAD_ERR_OK) {$errors = [UPLOAD_ERR_INI_SIZE => 'File exceeds upload_max_filesize.',UPLOAD_ERR_FORM_SIZE => 'File exceeds form size limit.',UPLOAD_ERR_PARTIAL => 'File only partially uploaded.',UPLOAD_ERR_NO_TMP_DIR => 'Temporary directory missing.',UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk.',UPLOAD_ERR_EXTENSION => 'A PHP extension stopped the upload.'];return ['status' => FALSE,'error' => isset($errors[$_FILES[$field_name]['error']]) ? $errors[$_FILES[$field_name]['error']] : 'Unknown upload error.'];}// 检查文件大小(3GB 限制)if ($_FILES[$field_name]['size'] > 3*1024 * 1024 * 1024) {return ['status' => FALSE,'error' => 'File size exceeds 1GB limit.'];}// 获取文件信息$original_name = $_FILES[$field_name]['name'];$tmp_path = $_FILES[$field_name]['tmp_name'];$extension = pathinfo($original_name, PATHINFO_EXTENSION);$extension = $extension ? strtolower($extension) : '';// 生成本地存储路径$local_file_name = uniqid('upload_', true) . ($extension ? '.' . $extension : '');$local_file_path = $upload_path . $local_file_name;// 移动文件到本地目录if (!move_uploaded_file($tmp_path, $local_file_path)) {return ['status' => FALSE,'error' => 'Failed to move uploaded file.'];}// 确保文件可写if (!is_writable($local_file_path)) {chmod($local_file_path, 0666);}try {// 根据文件大小选择上传方式$file_size = filesize($local_file_path);$file_handle = fopen($local_file_path, 'rb');if ($file_size > 50 * 1024 * 1024) { // 大于 50MB 使用分片上传$result = $this->cosClient->upload($this->config['bucket'],$cos_path,$file_handle,['PartSize' => 10 * 1024 * 1024]);} else {$result = $this->cosClient->putObject(['Bucket' => $this->config['bucket'],'Key' => $cos_path,'Body' => $file_handle]);}// 显式关闭文件句柄if (is_resource($file_handle)) {fclose($file_handle);}// 删除本地临时文件if (!unlink($local_file_path)) {log_message('error', 'Failed to delete local file: ' . $local_file_path . ' | Error: ' . error_get_last()['message']);}return ['status' => TRUE,'data' => ['file_name' => $original_name,'cos_path' => $cos_path,'url' => $result['Location'],'extension' => $extension]];} catch (\Exception $e) {// 显式关闭文件句柄if (is_resource($file_handle)) {fclose($file_handle);}// 删除本地临时文件if (file_exists($local_file_path) && !unlink($local_file_path)) {log_message('error', 'Failed to delete local file: ' . $local_file_path . ' | Error: ' . error_get_last()['message']);}return ['status' => FALSE,'error' => 'COS Upload Failed: ' . $e->getMessage()];}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85255.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 632.最小区间

你有 k 个 非递减排列 的整数列表。找到一个 最小 区间&#xff0c;使得 k 个列表中的每个列表至少有一个数包含在其中。 我们定义如果 b-a < d-c 或者在 b-a d-c 时 a < c&#xff0c;则区间 [a,b] 比 [c,d] 小。 示例 1&#xff1a; 输入&#xff1a;nums [[4,10,…

篇章五 系统性能优化——资源优化——CPU优化(2)

目录 1.高级并发模式 1.1 工作窃取&#xff08;Work Stealing&#xff09; 1.工作窃取模式 2.ForkJoinPool实现 3.具体例子 1.2 结构化并发&#xff08;Structured Concurrency&#xff09; 1.结构化并发模式 2.Java 19 的 StructuredTaskScope 3.具体例子 1.3 对比与…

《中国电信运营商骨干网:历史、现状与未来演进》系列 第四篇:后发先至——中国移动CMNET的快速扩张与IP专网布局

摘要&#xff1a; 本文深入探讨中国移动骨干网CMNET (AS9808) 的发展历程、网络架构及其与中国电信扁平化策略的差异。同时&#xff0c;解析其为承载高价值业务而构建的IP专用承载网的定位、结构与技术特点。最后&#xff0c;展望中国移动在5G、云计算和算力网络时代&#xff0…

R情感分析:解码文本中的情感

基于之前关于文本聚类和文本模型的博客&#xff0c;我们现在可以深入探讨一个经典主题 - 情感分析。情感分析通过计算方式识别和分类文本中的情感&#xff0c;帮助理解公众意见或消费者反馈。 什么是情感分析&#xff1f; 情感分析确定文本背后的情感基调&#xff0c;将其分类…

云徙渠道订货系统:赋能企业渠道管理的数字化引擎

在当今商业竞争日益激烈的环境下&#xff0c;企业如何高效管理和优化渠道成为关键问题。云徙渠道订货系统凭借其强大的数字化能力&#xff0c;为企业提供了全新的渠道管理解决方案&#xff0c;助力企业在复杂多变的市场环境中保持竞争力。 从渠道管理的痛点出发 传统渠道管理方…

Nacos基础使用(二):nacos作为配置中心

一、Nacos 配置中心核心属性 在学习nacos 作为配置中心的使用之前&#xff0c;先看下Nacos 作为配置中心时的三个属性&#xff0c;即&#xff1a; 命名空间、配置分组、配置集ID&#xff08;习惯称为配置文件ID&#xff09;&#xff1b;在使用Nacos 作为配置中心 的过程中可以通…

SpringBoot 插件化架构的4种实现方案

在复杂业务场景下&#xff0c;传统的单体应用架构往往面临着功能扩展困难、代码耦合严重、迭代效率低下等问题。 插件化架构作为一种模块化设计思想的延伸&#xff0c;能够使系统具备更好的扩展性和灵活性&#xff0c;实现"热插拔"式的功能扩展。 本文将介绍Spring…

VGG-19(Visual Geometry Group)模型

VGG-19 是由牛津大学视觉几何组和 Google DeepMind 的研究人员在 2014 年提出的一个非常经典的深度卷积神经网络模型。 一 核心结构 &#xff08;1&#xff09;深度&#xff1a; 模型名称中的 "19" 指的是模型拥有 19 层带有权重的层&#xff08;通常指&#xff1a;…

Windows11 鼠标卡死任务栏卡死 假死解决方法

最近很多朋友都有一个问题&#xff0c;就是Windows11电脑 在编辑文档或者是切换窗口的时候出现任务栏假死&#xff0c;鼠标左右键失灵等现象&#xff0c;想了几天解决方案今天吧最直接的方法教给大家 首发玖毅论坛 玖毅论坛https://www.webbbs.cn/ 第一步&#xff1a; 第一种…

BeikeShop - 一个开源、用户友好的跨境电子商务平台

BeikeShop - 一个开源、用户友好的跨境电子商务平台 BeikeShop 是全球领先的基于 Laravel 框架的开源电子商务平台&#xff0c;专为国际贸易和跨境电子商务行业设计。 该系统是 100% 开源的&#xff01;它支持多语言、多币种、支付、物流、会员管理等广泛的实用功能&#xff0…

基于大模型的胆囊结石全周期诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与创新点 二、大模型预测胆囊结石的原理与技术基础 2.1 大模型概述 2.2 用于胆囊结石预测的数据来源 2.3 模型构建与训练 2.4 模型评估指标 三、术前风险预测与手术方案制定 3.1 术前评估指标与数…

[论文阅读] 人工智能 | Gen-n-Val:利用代理技术革新计算机视觉数据生成

Gen-n-Val&#xff1a;利用代理技术革新计算机视觉数据生成 论文信息 article{huang2025gennval,title{Gen-n-Val: Agentic Image Data Generation and Validation},author{Huang, Jing-En and Fang, I-Sheng and Huang, Tzuhsuan and Wang, Chih-Yu and Chen, Jun-Cheng},jo…

【AI论文】ReasonMed:一个370K的多智能体生成数据集,用于推进医疗推理

摘要&#xff1a;尽管基于推理的大型语言模型&#xff08;LLM&#xff09;在数学和编程方面表现出色&#xff0c;但它们在知识密集型医疗问题回答方面的能力仍未得到充分探索。为解决这一问题&#xff0c;我们推出了ReasonMed&#xff0c;这是最大的医疗推理数据集&#xff0c;…

singlefligt使用方法和源码解读

singlefligt使用方法和源码解读 介绍 sync.once保证其整个生命周期内只调用一次&#xff1b;而singleflight则可以保证在一定范围内其只调用一次。 背景|使用场景 应对缓存击穿&#xff1a;加锁可以解决这个问题&#xff0c;但是加锁不太灵活&#xff08;不能控制访问频率之…

HTTP 协议的基本概念(请求/响应流程、状态码、Header、方法)问题解决方案大全

HTTP 协议的基本概念&#xff08;请求/响应流程、状态码、Header、方法&#xff09;问题解决方案大全 一. 摘要 HTTP 协议是 Web 开发的基石&#xff0c;但初学者往往只停留在 GET、POST 的层面&#xff0c;对重定向机制、缓存控制、请求体解析等概念缺乏深入理解&#xff0c;…

Python中常用的函数

以下是Python中常用的函数分类整理&#xff0c;涵盖基础操作、数据处理、文件操作、面向对象等场景&#xff0c;并附上示例说明&#xff1a; --- ### **一、基础内置函数** | 函数 | 作用 | 示例 | |----…

【Windows】删除鼠标右键多余菜单的方法

要删除鼠标右键菜单中的多余菜单&#xff0c;如&#xff1a;“打开抖音壁纸”选项&#xff0c;通常需要通过修改注册表或使用第三方工具来清理残留的注册表项。以下是详细步骤&#xff08;操作注册表前务必备份&#xff01;&#xff09;&#xff1a; 方法一&#xff1a;通过注册…

【性能优化】启用zram

性能优化 系统内存不足时&#xff0c;可以考虑启动ZRAM功能&#xff08;压缩内存&#xff09;。关于ZRAM的概念&#xff0c;可自行学习。这里记录一下&#xff0c;启用ZRAM的方式。 启用ZRAM&#xff0c;可能会导致CPU升高&#xff0c;以及低内存时的恶性循环。是否启用需要综…

深度解析YOLOv8:CSPHet卷积结构如何实现极致轻量化

文章目录 一、背景介绍1.1 YOLOv8的现状1.2 降参数的必要性 二、相关技术介绍2.1 Dual思想2.2 HetConv 三、CSPHet结构设计3.1 CSP模块的改进3.2 结合HetConv3.3 参数量的下降 四、CSPHet的代码实现五、实验结果六、总结与展望 在目标检测领域&#xff0c;YOLO系列算法一直以其…

适配器模式demo

#include <QCoreApplication> #include <iostream>using namespace std;class XmCom { public:void ComByXm(){cout << "XM电源适配器只适用于小米笔记本电脑" << endl;} };class LxCom { public:virtual void ComByLx() 0;virtual ~LxCom…