useUploadFileToOSS.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // 上传文件到阿里云oss
  2. import OSS from 'ali-oss'
  3. import {apiGetOSSSign} from '@/api/common'
  4. /* const Minio = require('minio')
  5. const stream = require('stream') */
  6. import * as Minio from 'minio-es'
  7. import * as stream from 'stream'
  8. import * as buffer from 'buffer'
  9. const Buffer = buffer.Buffer
  10. /**
  11. * 上传到oss
  12. * @param data 文件数据
  13. * @param fileName 存放在oss中的文件路径包含文件名
  14. * @param isMultipart 是否分片上传
  15. * @returns fileUrl 返回文件在阿里云上的地址
  16. */
  17. export async function useUploadFileToOSS(data,fileName,isMultipart=false){
  18. const signRes=await apiGetOSSSign({StorageSource:1})
  19. if(signRes.Ret!==200) return
  20. const accessKeyId=signRes.Data.AccessKeyId
  21. const accessKeySecret=signRes.Data.AccessKeySecret
  22. const stsToken=signRes.Data.SecurityToken
  23. const ALOSSINS=new OSS({
  24. // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  25. region: "oss-cn-shanghai",
  26. // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
  27. accessKeyId: accessKeyId,
  28. accessKeySecret: accessKeySecret,
  29. // 从STS服务获取的安全令牌(SecurityToken)。
  30. stsToken: stsToken,
  31. // 填写Bucket名称,例如examplebucket。
  32. bucket: "hzchart",
  33. endpoint:'hzstatic.hzinsights.com',
  34. cname:true,
  35. timeout:6000000
  36. });
  37. let res=null,resUrl='';
  38. try {
  39. if(isMultipart){
  40. const options = {
  41. // 获取分片上传进度、断点和返回值。
  42. progress: (p, cpt, res) => {
  43. // console.log(p);
  44. // ALOSSAbortCheckpoint=cpt
  45. // this.percentage=parseInt(p*100)
  46. },
  47. // 设置并发上传的分片数量。
  48. parallel: 10,
  49. // 设置分片大小。默认值为1 MB,最小值为100 KB。
  50. partSize: 1024 * 1024 * 10, // 10MB
  51. };
  52. res=await ALOSSINS.multipartUpload(fileName,data,{...options})
  53. }else{
  54. res=await ALOSSINS.put(fileName,data)
  55. }
  56. if(res.res.status===200){
  57. resUrl='https://hzstatic.hzinsights.com/'+res.name
  58. }
  59. } catch (error) {
  60. console.log('阿里云上传失败',error);
  61. }
  62. return resUrl
  63. }
  64. //vite 不支持Buffer 代替Buffer.form方法
  65. const toBinary = (data)=>{
  66. const length = data.length
  67. let buf = new ArrayBuffer(length)
  68. let view = new Uint8Array(buf)
  69. for(let i=0;i<length;++i){
  70. view[i] = data[i]
  71. }
  72. let blob = new Blob([buf],{type:'application/x-tra'})
  73. const url = URL.createObjectURL(blob)
  74. return url
  75. }
  76. //上传到minio
  77. // minio sdk 文档 https://min.io/docs/minio/linux/developers/javascript/API.html
  78. export async function useUploadToMinIO (file, fileName, options = {}){
  79. const res = await apiGetOSSSign({StorageSource:2})
  80. if (res.Ret !== 200) {
  81. console.log("获取minio临时签名错误,res.Ret=" + res.Ret)
  82. return
  83. }
  84. const minioClient = new Minio.Client({
  85. endPoint: res.Data.Endpoint.split(':')[0],
  86. port: Number(res.Data.Port) || undefined,
  87. useSSL: res.Data.UseSSL.toLocaleLowerCase() == "false" ? false : true,
  88. accessKey: res.Data.AccessKeyId,
  89. secretKey: res.Data.SecretKeyId,
  90. })
  91. console.log(minioClient);
  92. try {
  93. var metaData = {
  94. ...{
  95. 'Content-Type': file.type || 'application/octet-stream',
  96. "Content-Length": file.size,
  97. },
  98. ...options
  99. }
  100. minioClient.bucketExists(res.Data.Bucketname, function (err, exists) {
  101. if (err) {
  102. return console.log("minio 查看桶是否存在失败" + err)
  103. }
  104. if (!exists) {
  105. // 不存在桶,创建桶
  106. console.log("桶不存在,先创建桶", res.Data.Bucketname);
  107. minioClient.makeBucket(res.Data.Bucketname, res.Data.RegionId, function (err) {
  108. if (err) {
  109. console.log("minio 创建桶失败" + err)
  110. return
  111. }
  112. let reader = new FileReader();
  113. // console.log(reader);
  114. reader.readAsArrayBuffer(file);
  115. reader.onloadend = function (e) {
  116. const dataurl = e.target.result;
  117. let bufferStream = new stream.PassThrough();
  118. // 转化成数据流 minio接受数据流格式
  119. bufferStream.end(Buffer.from(dataurl))
  120. //bufferStream.end(toBinary(dataurl))
  121. // console.log(bufferStream);
  122. const bufferUrl = toBinary(dataurl)
  123. minioClient.putObject(res.Data.Bucketname, fileName, bufferStream, file.size, metaData, function (err, etag) {
  124. if (err) {
  125. return console.log("上传到minio失败:" + err)
  126. }
  127. let fileUrl = fileName.startsWith('/') ? res.Data.ImgHost + fileName : res.Data.ImgHost + "/" + fileName
  128. return fileUrl
  129. })
  130. }
  131. })
  132. }
  133. if (exists) {
  134. // console.log("桶存在",res.Data.Bucketname);
  135. let reader = new FileReader();
  136. console.log('reader',reader);
  137. reader.readAsArrayBuffer(file);
  138. reader.onloadend = function (e) {
  139. const dataurl = e.target.result;
  140. let bufferStream = new stream.PassThrough();
  141. bufferStream.end(Buffer.from(dataurl))
  142. //bufferStream.end(toBinary(dataurl))
  143. const bufferUrl = toBinary(dataurl)
  144. minioClient.putObject(res.Data.Bucketname, fileName, bufferStream, metaData, function (err, etag) {
  145. if (err) {
  146. console.log("上传到minio失败:" + err)
  147. return
  148. }
  149. let fileUrl = fileName.startsWith('/') ? res.Data.ImgHost + fileName : res.Data.ImgHost + "/" + fileName
  150. console.log('test',fileUrl)
  151. return fileUrl
  152. })
  153. }
  154. }
  155. })
  156. } catch (error) {
  157. console.error(error);
  158. if (error.name !== "cancel") {
  159. //不是取消上传的则给错误提示
  160. this.$message.warning("上传失败,请刷新重试");
  161. }
  162. }
  163. }