当前位置:   article > 正文

Vue3_对接腾讯云COS_大文件分片上传和下载

Vue3_对接腾讯云COS_大文件分片上传和下载

目录

 一、腾讯云后台配置

二、安装SDK

1.script 引入方式

2.webpack 引入方式

三、文件上传

1.new COS 实例

2.上传文件

四、文件下载


腾讯云官方文档:

腾讯云官方文档icon-default.png?t=N7T8https://cloud.tencent.com/document/product/436/11459

 一、腾讯云后台配置

1.登录 对象存储控制台创建存储桶。获取存储桶名称和 地域名称

2. 登录 访问管理控制台 ,获取您的项目 SecretId 和 SecretKey。

3. 配置 CORS 规则,AllowHeader 需配成*,ExposeHeaders 需要 ETag、Content-Length 以及其他 js 需要读取的 header 字段,如下图所示。操作详情请参见 设置跨域访问 文档。

二、安装SDK

1.script 引入方式

  1. <!--src为本地路径 根据自己项目目录结构来调整-->
  2. <script src="../dist/cos-js-sdk-v5.min.js"></script>

2.webpack 引入方式

安装:

npm i cos-js-sdk-v5 --save

引入:

  1. // node引入方式
  2. const COS = require('cos-js-sdk-v5');
  3. // js引入方式
  4. import COS from 'cos-js-sdk-v5';

三、文件上传

本案例用npm方式安装SDK,使用js方式引入。文件上传使用的是,高级上传,高级上传接口 uploadFile,自动针对小文件使用简单上传,大文件使用分块上传,性能更好。

腾讯云文件高级上传参数icon-default.png?t=N7T8https://cloud.tencent.com/document/product/436/64960#.E9.AB.98.E7.BA.A7.E4.B8.8A.E4.BC.A0

1.new COS 实例

  1. import COS from "cos-js-sdk-v5";
  2. const cos = new COS({
  3. // getAuthorization 必选参数
  4. getAuthorization: function (options, callback) {
  5. callback({
  6. TmpSecretId: "在控制台查看",
  7. TmpSecretKey: "在控制台查看",
  8. SecurityToken: "临时密钥_后端返回来的",
  9. ExpiredTime: "临时密钥到期时间_后端返回来的", // 时间戳,单位秒,如:1580000000
  10. });
  11. },
  12. });

后端获得临时密钥的步骤:

后端获得临时密钥并返给前端icon-default.png?t=N7T8https://cloud.tencent.com/document/product/436/14048

2.上传文件

文件上传,我们用的高级上传接口,自动识别,小文件(低于你设置的数据)直接上传,大文件分片上传。

  1. <template>
  2. <!-- 上传组件用的el-upload -->
  3. <el-upload
  4. class="upload-demo"
  5. action="#"
  6. drag
  7. multiple
  8. :auto-upload="false"
  9. :show-file-list="true"
  10. v-model:file-list="fileList"
  11. :on-change="
  12. (file, fileList) => {
  13. handleChange(file, fileList);
  14. }
  15. "
  16. :on-remove="handleRemove"
  17. >
  18. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  19. <div class="el-upload__text">拖拽文件到这里或者<em>点击上传</em></div>
  20. </el-upload>
  21. </template>
  22. <script setup>
  23. import COS from "cos-js-sdk-v5";
  24. import { computed, reactive } from "vue";
  25. //从后端获得临时密钥的请求接口,换成你自己的
  26. import { reqCloudInfo } from "@/api";
  27. const state = reactive({
  28. result: "",
  29. });
  30. //从后端获得请求临时密钥,换成你自己的
  31. const getData = async () => {
  32. let result = await reqCloudInfo();
  33. if (result != undefined) {
  34. if (result.error_code == 0) {
  35. state.result = result;
  36. } else {
  37. console.log(result);
  38. }
  39. }
  40. };
  41. getData ();
  42. // new 一个COS实例
  43. const cos = new COS({
  44. getAuthorization: function (options, callback) {
  45. //credentials ,按照你的后端返回来的数据自行赋值
  46. let credentials = state.result.datas_info.Credentials;
  47. callback({
  48. TmpSecretId: credentials.TmpSecretId,
  49. TmpSecretKey: credentials.TmpSecretKey,
  50. SecurityToken: credentials.Token,
  51. ExpiredTime: state.result.datas_info.ExpiredTime, // 时间戳,单位秒,如:1580000000
  52. });
  53. },
  54. });
  55. // 文件上传 选择文件时触发(:on-change事件)
  56. const handleChange = (uploadFile, uploadFiles) => {
  57. //cosData ,根据你后端返回的数据自行赋值
  58. let cosData = state.result.datas_info;
  59. cos.uploadFile(
  60. {
  61. Bucket: cosData.Bucket /* 填入您自己的存储桶,必须字段 */,
  62. Region: cosData.Region /* 存储桶所在地域,例如ap-beijing,必须字段 */,
  63. Key:
  64. cosData.Key +
  65. "/1.jpg" /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),必须字段 */,
  66. Body:
  67. uploadFile.raw /* 必须,上传文件对象,可以是input[type="file"]标签选择本地文件后得到的file对象 */,
  68. SliceSize: 1024 * 1024 * 5 /* 触发分块上传的阈值,超过5MB使用分块上传,非必须 */,
  69. onTaskReady: function (taskId) {
  70. /* 非必须 */
  71. console.log(taskId);
  72. },
  73. onProgress: function (progressData) {
  74. /* 非必须 */
  75. console.log(JSON.stringify(progressData));
  76. },
  77. onFileFinish: function (err, data, options) {
  78. /* 非必须 */
  79. console.log(options.Key + "上传" + (err ? "失败" : "完成"));
  80. },
  81. },
  82. function (err, data) {
  83. console.log(err || data);
  84. }
  85. );
  86. };
  87. </script>
  88. <style scoped></style>

如果报错403:

报错403解决办法icon-default.png?t=N7T8https://cloud.tencent.com/document/product/436/54303#message-.E4.B8.BA-.E2.80.9Caccess-denied..E2.80.9D

如果报了“Access Denied.”,就是后端临时密钥权限不对,让他添加相应字段即可。上传文件的,分片上传的,文件读取下载的。

四、文件下载

下载文件到本地:

  1. import COS from "cos-js-sdk-v5";
  2. const cos = new COS({
  3. // getAuthorization 必选参数
  4. getAuthorization: function (options, callback) {
  5. callback({
  6. TmpSecretId: "在控制台查看",
  7. TmpSecretKey: "在控制台查看",
  8. SecurityToken: "临时密钥_后端返回来的",
  9. ExpiredTime: "临时密钥到期时间_后端返回来的", // 时间戳,单位秒,如:1580000000
  10. });
  11. },
  12. });
  13. //文件下载
  14. cos.getObject(
  15. {
  16. Bucket: /* 填入您自己的存储桶,从后端返回的数据获取*/,
  17. Region: /* 存储桶所在地域,例如ap-beijing*/,
  18. Key: /*你的key*/,
  19. DataType: "blob",
  20. onProgress: function (progressData) {},
  21. },
  22. function (err, data) {
  23. if (data.Body) {
  24. //通过浏览器下载
  25. const myBlob = new window.Blob([data.Body], { type: data.Body.type });
  26. let name = "文件名字通过cosData.Key获取";
  27. const qrUrl = window.URL.createObjectURL(myBlob);
  28. var fileLink = document.createElement("a");
  29. fileLink.href = qrUrl;
  30. fileLink.setAttribute("download", name);
  31. document.body.appendChild(fileLink);
  32. fileLink.click();
  33. }
  34. }
  35. );

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/701263
推荐阅读