当前位置: 首页 > news >正文

OSS---前端直传阿里云OSS

在做前端开发的时候,经常会遇到需要上次大文件的情况,这个时候,如果是先上传到服务器,在从服务器上传到阿里云OSS,就会很慢,而且可能在上传到服务器的时候,系统就卡死了。

这个时候,可以考虑直接传到阿里云OSS,然后保存文件地址就可以了。

Thinkphp后端源代码:

public function oss()
{// 配置信息(建议从配置文件中读取)$accessKeyId = 'LTAI5tMWerwssrsLjmZVu';$accessKeySecret = 'zwCcidsdeeefsfsdfsdfQ8o3BmIl';$endpoint = 'oss-cn-chengdu.aliyuncs.com';$bucket = 'doddcdeeeeped';// 生成上传策略$dir = 'videos/'; // 上传目录$callbackUrl = request()->domain() . '/oss/callback'; // 上传回调地址// 生成唯一文件名(可根据需要调整)$fileName = $dir . uniqid() . '.' . pathinfo(request()->param('filename'), PATHINFO_EXTENSION);// 构造回调参数$callback_param = ['callbackUrl' => $callbackUrl,'callbackBody' => 'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}','callbackBodyType' => 'application/x-www-form-urlencoded'];$callback_string = json_encode($callback_param);$base64_callback_body = base64_encode($callback_string);    // 构造上传策略$policy = ['expiration' => date('Y-m-d\TH:i:s\Z', strtotime('+1 hour')), // 1小时后过期'conditions' => [['content-length-range', 0, 104857600], // 最大100MB['starts-with', '$key', $dir]]];$policy = json_encode($policy);$base64_policy = base64_encode($policy);$signature = base64_encode(hash_hmac('sha1', $base64_policy, $accessKeySecret, true));    // 返回前端所需参数return json(['accessid' => $accessKeyId,'policy' => $base64_policy,'signature' => $signature,'key' => $fileName,'host' => "https://{$bucket}.{$endpoint}",'callback' => $base64_callback_body]);
}

前端代码:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>视频直传阿里云OSS</title><script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
</head>
<body><h1>视频上传</h1><input type="file" id="video-file" accept="video/*"><button id="upload-btn">上传</button><div id="progress-container" style="display: none;"><progress id="upload-progress" value="0" max="100"></progress><span id="progress-text">0%</span></div><div id="result"></div><script>$(function() {$('#upload-btn').click(function() {const fileInput = $('#video-file')[0];if (fileInput.files.length === 0) {alert('请选择视频文件');return;}const file = fileInput.files[0];// 检查文件大小(可选)if (file.size > 100 * 1024 * 1024) { // 100MB
                alert('文件大小不能超过100MB');return;}// 显示进度条
            $('#progress-container').show();$('#result').empty();// 1. 获取OSS上传凭证
            $.ajax({url: '/common/config/config/oss',type: 'GET',data: {filename: file.name},dataType: 'json',success: function(response) {// 2. 构造表单数据
                    const formData = new FormData();formData.append('key', response.key);formData.append('policy', response.policy);formData.append('OSSAccessKeyId', response.accessid);formData.append('signature', response.signature);formData.append('callback', response.callback);formData.append('file', file);// 3. 上传到OSS
                    $.ajax({url: response.host,type: 'POST',data: formData,processData: false,contentType: false,xhr: function() {const xhr = new XMLHttpRequest();xhr.upload.addEventListener('progress', function(e) {if (e.lengthComputable) {const percent = Math.round((e.loaded / e.total) * 100);$('#upload-progress').val(percent);$('#progress-text').text(percent + '%');}}, false);return xhr;},success: function(result) {// 这里实际上OSS会回调我们设置的callback URL// 前端这里只是显示上传完成,实际业务处理在callback方法中
                            $('#result').html('<p>上传成功!文件正在处理中...</p>');},error: function(xhr, status, error) {$('#result').html('<p style="color:red;">上传失败: ' + error + '</p>');}});},error: function(xhr, status, error) {$('#result').html('<p style="color:red;">获取上传凭证失败: ' + error + '</p>');}});});});</script>
</body>
</html>

此时,可能会出现跨域报403的错误:

image

请求报错:

image

这个时候需要设置跨域:设置位置:

image

参考:

https://developer.aliyun.com/article/1560819
解决方法:在OSS控制台创建跨域规则
1. 登录OSS管理控制台。
2. 单击Bucket列表,然后单击目标Bucket名称。
3. 在左侧导航栏,选择数据安全>跨域设置。
4. 在跨域设置页面,单击创建规则。
5. 在创建跨域规则面板,将来源设置为*,允许Methods全部勾选,允许Headers设置为*,暴露Headers设置为ETag和x-oss-request-id,缓存时间设置为0,选中返回Vary: Origin,然后单击确定。关于如何设置跨域规则,请参见设置跨域访问。
在创建跨域规则弹窗中,
将来源设置为*
允许Methods全部勾选
允许Headers设置为*
暴露Headers设置为ETag和x-oss-request-id
缓存时间设置为0
选中返回Vary: Origin。

b9e3bb9608b3a9897e4ced3ba6abe392_zpiaduicf3hfi_53bb929be01c446996ea56724ca1c9d9_x-oss-process=image%2Fresize%2Cw_1400%2Cm_lfit%2Fformat%2Cwebp

这里可以设置为【*】表示允许所有,如果要设置某个域名,需要带【http/https】比如:http://*.domain.com

打完收工!

http://www.jsqmd.com/news/451272/

相关文章:

  • ANIMATEDIFF PRO保姆级教程:5分钟部署你的电影级AI动画工作站
  • FireRedASR Pro数据库集成实战:语音识别结果存储与检索方案
  • 突破百度文库下载限制:开源文档获取工具全解析
  • SmallThinker-3B效果展示:跨境电商商品描述→多语言卖点提炼→广告文案生成
  • 利用快马平台快速构建双调∨k算法可视化原型,十分钟完成交互演示
  • GLM-Image部署教程(Linux版):bash start.sh参数详解与自定义端口配置
  • MiniCPM-V-2_6案例分享:我是如何用它快速处理工作截图和会议纪要的?
  • 使用LingBot-Depth进行Ubuntu系统下的3D开发环境配置
  • DAMO-YOLO手机检测系统灰盒测试:输入对抗样本验证鲁棒性
  • 突破虚幻引擎限制:UE4SS Mod开发全流程实战指南
  • UE4SS游戏Mod工具实战指南:从入门到精通
  • CosyVoice语音生成大模型-300M-25Hz系统管理:Ubuntu服务器运维与模型服务监控
  • 智能抢票工具:高效自动化解决演唱会门票抢购难题
  • 异步节点响应延迟超800ms?Dify v0.9+最新线程池+Redis Stream双缓冲调优方案,今晚就能上线
  • OFA-Image-Caption前端展示:基于Vue.js构建实时图片描述演示平台
  • 5个维度解析wvp-GB28181-pro:从设备兼容难题到智能安防价值
  • GAN训练不收敛?试试特征匹配损失函数(附PyTorch代码实现)
  • 游戏开发必备技能:用C#位运算实现状态标记(从字节bit操作说起)
  • DeOldify智能体应用:构建自动化的老照片修复Agent
  • 1小时搭建CRON管理后台:快马平台快速原型实践
  • 如何用AI快速构建ETL工具:KETTLE自动化开发指南
  • ComfyUI报错深度解析:prompt outputs failed validation: loadimage的解决方案与最佳实践
  • 前端视频处理实践解析:基于MP4Box.js的FastStart模式检测技术指南
  • 造相-Z-Image实测:10分钟本地部署,中英文提示词直接生成高清人像
  • 如何用RetinaFace镜像批量处理图片?一键生成带标注的结果图
  • 电子课本下载:提升教育资源获取效率的3个实用技巧
  • wvp-GB28181-pro:构建安防系统集成的零代码解决方案
  • 5大突破!零基础掌握开源监控平台wvp-GB28181-pro实战指南
  • gte-base-zh实战案例分享:构建中文FAQ智能匹配系统的Embedding底座
  • Guohua Diffusion 效率工具:像使用Typora一样流畅地管理Prompt与生成结果