aws s3 存储桶 前端组件上传简单案例

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

写一个vue3 上传aws oss存储的案例


使用到的插件

  1. npm install @aws-sdk/client-s3
复制代码
注意事项 :

1. 本地调试 , 需要设置在官网设置跨域  必须!!! 否则调试不了 ,前端署理是不起作用的 ,因为是插件sdk的直接调用


2. 此方法只针对后端懒鬼 直接让前端使用ACCESS_KEY_ID 和AWS_SECRET_ACCESS_KEY 举行直传  正经开发不推荐 


友好的谷歌插件 :Fileon - S3 Browser   可以直观查看存储桶


封装组件代码示例  UploadImage.vue

  1. <template>
  2.   <div>
  3.     <input
  4.       ref="fileInput"
  5.       class="absolute top-[-10000px] left-[-10000px]"
  6.       type="file"
  7.       id="file"
  8.       name="file"
  9.       accept="image/png, image/jpeg, image/gif, image/jpg"
  10.       @change="handleFileChange"
  11.     />
  12.     <!-- <button @click="$refs.fileInput.click()">选择文件</button> -->
  13.     <!-- <button @click="uploadFile">上传文件</button> -->
  14.   </div>
  15. </template>
  16. <script setup>
  17. import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
  18. import { ref, defineEmits } from "vue";
  19. const s3Client = new S3Client({
  20.   region: "ap-southeast-1",
  21.   credentials: {
  22.     accessKeyId: import.meta.env.VITE_APP_AWS_ACCESS_KEY_ID,
  23.     secretAccessKey: import.meta.env.VITE_APP_AWS_SECRET_ACCESS_KEY,
  24.   },
  25. });
  26. const chooseFile = () => {
  27.   fileInput.value.click();
  28. };
  29. const fileInput = ref(null);
  30. const selectedFile = ref(null);
  31. const handleFileChange = (event) => {
  32.   selectedFile.value = event.target.files[0];
  33.   //将input读取到的File格式的图片文件 转为base64提供访问
  34.   convertFileToUrl(event.target.files[0]);
  35. };
  36. const convertFileToUrl = (file) => {
  37.   const reader = new FileReader();
  38.   reader.onload = (e) => {
  39.     let imageUrl = e.target.result;
  40.     // console.log("imageUrl", imageUrl);
  41.     // 文件读取完成后,将结果发送给父组件
  42.     emit("file-chosen", e.target.result);
  43.   };
  44.   reader.readAsDataURL(file);
  45. };
  46. const uploadFile = async () => {
  47.   console.log("开始上传文件", selectedFile.value, selectedFile.value.name);
  48.   if (!selectedFile.value) return console.log("未选择文件");
  49.   try {
  50.     const bucketName = "hy-bucket11";
  51.     const key = `uploads/${selectedFile.value.name}`;
  52.     const params = {
  53.       Bucket: bucketName,
  54.       Key: key,
  55.       Body: selectedFile.value,
  56.     };
  57.     const command = new PutObjectCommand(params);
  58.     await s3Client.send(command);
  59.     console.log("文件上传成功");
  60.     // 访问地址
  61.     // [$Schema]://[$Bucket].[$Endpoint]/[$Object]
  62.     console.log(
  63.       "https://hy-bucket11.ap-southeast-1.amazonaws.com/uploads/" +
  64.         selectedFile.value.name
  65.     );
  66.   } catch (error) {
  67.     console.error("文件上传失败", error);
  68.   }
  69. };
  70. // 暴露方法给父组件
  71. defineExpose({ chooseFile, uploadFile });
  72. // 调用父组件方法
  73. const emit = defineEmits(["file-chosen"]);
  74. </script>
  75. <!-- 父组件调用示例 导入组件 -->
  76. <!-- <UploadImage ref="uploadImageRef" @file-chosen="handleFileChosen" /> -->
  77. <!-- 父组件调用示例 选择图片 -->
  78. <!-- const selectImag = () => {
  79.   uploadImageRef.value?.chooseFile();
  80. }; -->
  81. <!--父组件调用示例 图片回传 -->
  82. <!-- const handleFileChosen = (base64Url: any) => (checkImage.value = base64Url); -->
  83. <!--父组件调用示例 上传文件 -->
  84. <!-- uploadImageRef.value?.uploadFile(); -->
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表