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

AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用

自己踩过坑不想别人也踩坑了 亚马逊S3存储桶直传前端demo复制即可使用

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>S3 直传示例</title><style>.container {max-width: 600px;margin: 50px auto;padding: 20px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);border-radius: 8px;}.upload-area {border: 2px dashed #ccc;padding: 20px;text-align: center;margin: 20px 0;border-radius: 4px;}.upload-area.dragover {background-color: #e1f5fe;border-color: #2196f3;}.progress {margin-top: 20px;display: none;}.progress-bar {height: 20px;background-color: #4caf50;width: 0%;transition: width 0.3s;}.status {margin-top: 10px;color: #666;}</style></head><body><div class="container"><h1>S3 直传示例</h1><div class="upload-area" id="dropZone"><p>拖拽文件到这里或点击选择文件</p><input type="file" id="fileInput" style="display: none" /><button onclick="document.getElementById('fileInput').click()">选择文件</button></div><div class="progress" id="progressContainer"><div class="progress-bar" id="progressBar"></div><div class="status" id="status"></div></div></div><script>const dropZone = document.getElementById("dropZone");const fileInput = document.getElementById("fileInput");const progressContainer = document.getElementById("progressContainer");const progressBar = document.getElementById("progressBar");const status = document.getElementById("status");// 处理拖拽事件["dragenter", "dragover", "dragleave", "drop"].forEach((eventName) => {dropZone.addEventListener(eventName, preventDefaults, false);});function preventDefaults(e) {e.preventDefault();e.stopPropagation();}["dragenter", "dragover"].forEach((eventName) => {dropZone.addEventListener(eventName, highlight, false);});["dragleave", "drop"].forEach((eventName) => {dropZone.addEventListener(eventName, unhighlight, false);});function highlight(e) {dropZone.classList.add("dragover");}function unhighlight(e) {dropZone.classList.remove("dragover");}dropZone.addEventListener("drop", handleDrop, false);fileInput.addEventListener("change", handleFileSelect, false);function handleDrop(e) {const dt = e.dataTransfer;const files = dt.files;handleFiles(files);}function handleFileSelect(e) {const files = e.target.files;handleFiles(files);}async function handleFiles(files) {const file = files[0];if (!file) return;try {// 获取上传配置const response = await fetch(`BASEURL?file_name=${file.name}`);const data = await response.json();if (data.code === 20000) {// 显示进度条progressContainer.style.display = "block";progressBar.style.width = "0%";status.textContent = "开始上传...";// 执行上传const xhr = new XMLHttpRequest();xhr.upload.onprogress = (e) => {if (e.lengthComputable) {const percentComplete = (e.loaded / e.total) * 100;progressBar.style.width = percentComplete + "%";status.textContent = `上传进度: ${Math.round(percentComplete)}%`;}};xhr.onload = () => {if (xhr.status === 200) {status.textContent = "上传成功!";status.style.color = "#4CAF50";} else {status.textContent = "上传失败,请重试";status.style.color = "#f44336";}};xhr.onerror = () => {status.textContent = "上传出错,请重试";status.style.color = "#f44336";};xhr.open(data.data.method, data.data.url);xhr.send(file);} else {throw new Error(data.msg || "获取上传配置失败");}} catch (error) {console.error("上传出错:", error);status.textContent = "上传出错: " + error.message;status.style.color = "#f44336";}}</script></body>
</html>
http://www.lryc.cn/news/2402373.html

相关文章:

  • DAY 15 复习日
  • Vue Router 导航方法完全指南
  • MidJourney入门学习
  • 2025最新Java日志框架深度解析:Log4j 2 vs Logback性能实测+企业级实战案例
  • 如何安全高效的文件管理?文件管理方法
  • 基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座
  • Hive中ORC存储格式的优化方法
  • 代码训练LeetCode(23)随机访问元素
  • 【R语言编程绘图-plotly】
  • float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型
  • 通信刚需,AI联手ethernet/ip转profinet网关打通工业技术难关
  • JavaEE->多线程:定时器
  • 6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
  • <el-table>构建树形结构
  • linux——磁盘和文件系统管理
  • 云原生 DevOps 实践路线:构建敏捷、高效、可观测的交付体系
  • gateway 网关 路由新增 (已亲测)
  • ArcGIS Pro 3.4 二次开发 - 共享
  • Python html 库用法详解
  • C#异常处理进阶:精准获取错误行号的通用方案
  • 如何快速找出某表的重复记录 - 数据库专家面试指南
  • Python 训练营打卡 Day 33-神经网络
  • resolvers: [ElementPlusResolver()] 有什么用?
  • XHR / Fetch / Axios 请求的取消请求与请求重试
  • 机器学习-ROC曲线​​ 和 ​​AUC指标
  • Spring Boot缓存组件Ehcache、Caffeine、Redis、Hazelcast
  • 【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools
  • 如何有效删除 iPhone 上的所有内容?
  • AI大模型学习三十二、飞桨AI studio 部署 免费Qwen3-235B与Qwen3-32B,并导入dify应用
  • 操作系统中的设备管理,Linux下的I/O