BasePackage.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <div>
  3. <Button type="success" :loading="isLoading" :disabled="urlList.length < 2" @click="getSasStr(urlList)">{{ text }}</Button>
  4. </div>
  5. </template>
  6. <script>
  7. import FileSaver from "file-saver";
  8. import JSZip from "jszip";
  9. export default {
  10. name: "BasePackage",
  11. props: ['urlList', 'text', 'student'],
  12. data() {
  13. return {
  14. isLoading: false,
  15. sasString: ''
  16. };
  17. },
  18. created() { },
  19. methods: {
  20. /**
  21. * 获取blob授权信息
  22. * */
  23. getSasStr(list) {
  24. this.$api.uploadFile.getContainerSAS().then(
  25. (res) => {
  26. if (res.error == null) {
  27. this.sasString = res.result.data.SAS
  28. this.downloadFile(list)
  29. } else {
  30. this.$Message.error('API error!')
  31. }
  32. },
  33. (err) => {
  34. this.$Message.error('API error!')
  35. }
  36. )
  37. },
  38. downloadFile(data) {
  39. this.isLoading = true
  40. const selectList = [];
  41. const downloadname = data[0];
  42. for (let index = 0; index < data.length; index++) {
  43. selectList.push(data[index] + this.sasString);
  44. }
  45. if (selectList.length == data.length) {
  46. this.handleBatchDownload(selectList, downloadname); //存储待打包的URI数组和包的名称
  47. }
  48. },
  49. async handleBatchDownload(selectList, name) {
  50. const self = this;
  51. const data = selectList;
  52. const zip = new JSZip();
  53. const cache = {};
  54. const promises = [];
  55. /* 循环下载所有文件后 加入promise队列 */
  56. await data.forEach(item => {
  57. const promiseItem = self.getFile(item).then(dta => {
  58. const arr_name = item.split("/"); //处理名称
  59. var file_name = arr_name[arr_name.length - 1].split('?')[0];
  60. zip.file(file_name, dta, { binary: true }); // 逐个添加文件
  61. cache[file_name] = dta;
  62. });
  63. promises.push(promiseItem);
  64. });
  65. Promise.all(promises).then(() => {
  66. zip.generateAsync({ type: "blob" }).then(content => {
  67. // 生成二进制流
  68. FileSaver.saveAs(content, this.student.name + this.student.id + ".zip"); // 利用file-saver保存文件
  69. this.isLoading = false;
  70. })
  71. .catch(err => {
  72. console.log(err);
  73. this.isLoading = false;
  74. });
  75. });
  76. },
  77. //获取文件的arraybuffer格式并传入进行打包准备
  78. getFile(url) {
  79. return new Promise((resolve, reject) => {
  80. var xhr = new XMLHttpRequest();
  81. var formData = new FormData();
  82. xhr.open('get', url); //url填写后台的接口地址,如果是post,在formData append参数(参考原文地址)
  83. xhr.responseType = 'arraybuffer';
  84. xhr.onload = function (e) {
  85. resolve(e.currentTarget.response)
  86. };
  87. xhr.send(formData);
  88. })
  89. }
  90. },
  91. mounted() { }
  92. };
  93. </script>