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
英文地址,請注明出處:http://en.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…