useUploadFileToOSS.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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: signRes.Data.RegionId,
  26. // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
  27. accessKeyId: accessKeyId,
  28. accessKeySecret: accessKeySecret,
  29. // 从STS服务获取的安全令牌(SecurityToken)。
  30. stsToken: stsToken,
  31. // 填写Bucket名称,例如examplebucket。
  32. bucket: signRes.Data.Bucketname,
  33. endpoint:signRes.Data.Endpoint,
  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=signRes.Data.Imghost+res.name
  58. }
  59. } catch (error) {
  60. console.log('阿里云上传失败',error);
  61. }
  62. return resUrl
  63. }
  64. //上传到minio
  65. // minio sdk 文档 https://min.io/docs/minio/linux/developers/javascript/API.html
  66. export async function useUploadToMinIO (file, fileName, options = {}){
  67. const res = await apiGetOSSSign({StorageSource:2})
  68. if (res.Ret !== 200) {
  69. console.log("获取minio临时签名错误,res.Ret=" + res.Ret)
  70. return
  71. }
  72. const minioClient = new Minio.Client({
  73. endPoint: res.Data.Endpoint.split(':')[0],
  74. port: Number(res.Data.Port) || undefined,
  75. useSSL: res.Data.UseSSL.toLocaleLowerCase() == "false" ? false : true,
  76. accessKey: res.Data.AccessKeyId,
  77. secretKey: res.Data.SecretKeyId,
  78. })
  79. const metaData = {
  80. ...{
  81. 'Content-Type': file.type || 'application/octet-stream',
  82. "Content-Length": file.size,
  83. },
  84. ...options
  85. }
  86. return new Promise((resolve,reject)=>{
  87. try {
  88. minioClient.bucketExists(res.Data.Bucketname, function (err, exists) {
  89. if (err) {
  90. return console.log("minio 查看桶是否存在失败" + err)
  91. }
  92. if (!exists) {
  93. // 不存在桶,创建桶
  94. console.log("桶不存在,先创建桶", res.Data.Bucketname);
  95. minioClient.makeBucket(res.Data.Bucketname, res.Data.RegionId, function (err) {
  96. if (err) {
  97. console.log("minio 创建桶失败" + err)
  98. return
  99. }
  100. let reader = new FileReader();
  101. // console.log(reader);
  102. reader.readAsArrayBuffer(file);
  103. reader.onloadend = function (e) {
  104. const dataurl = e.target.result;
  105. let bufferStream = new stream.PassThrough();
  106. // 转化成数据流 minio接受数据流格式
  107. bufferStream.end(Buffer.from(dataurl))
  108. minioClient.putObject(res.Data.Bucketname, fileName, bufferStream, file.size, metaData, function (err, etag) {
  109. if (err) {
  110. return console.log("上传到minio失败:" + err)
  111. }
  112. let fileUrl = fileName.startsWith('/') ? res.Data.ImgHost + fileName : res.Data.ImgHost + "/" + fileName
  113. resolve(fileUrl)
  114. })
  115. }
  116. })
  117. }
  118. if (exists) {
  119. // console.log("桶存在",res.Data.Bucketname);
  120. let reader = new FileReader();
  121. reader.readAsArrayBuffer(file);
  122. reader.onloadend = function (e) {
  123. const dataurl = e.target.result;
  124. let bufferStream = new stream.PassThrough();
  125. bufferStream.end(Buffer.from(dataurl))
  126. minioClient.putObject(res.Data.Bucketname, fileName, bufferStream, metaData, function (err, etag) {
  127. if (err) {
  128. console.log("上传到minio失败:" + err)
  129. return
  130. }
  131. let fileUrl = fileName.startsWith('/') ? res.Data.ImgHost + fileName : res.Data.ImgHost + "/" + fileName
  132. //console.log('test',fileUrl)
  133. resolve(fileUrl)
  134. })
  135. }
  136. }
  137. })
  138. } catch (error) {
  139. console.error(error);
  140. if (error.name !== "cancel") {
  141. //不是取消上传的则给错误提示
  142. console.log("上传失败,请刷新重试");
  143. }
  144. reject(error)
  145. }
  146. })
  147. }
  148. //上传到s3
  149. export async function useUploadToS3(file,fileName,options={}){
  150. const res = await apiGetOSSSign({StorageSource:3})
  151. if(res.Ret!==200){
  152. console.log("获取s3前面错误,res.Ret="+res.Ret)
  153. return
  154. }
  155. const {
  156. Endpoint,
  157. AccessKeyId,
  158. AccessKeySecret,
  159. Port,
  160. Bucketname,
  161. RegionId,
  162. S3ForceStyle,
  163. S3Protocol
  164. } = res.Data
  165. const s3Client = new window.AWS.S3({
  166. apiVersion: '2006-03-01',
  167. endpoint:Endpoint,
  168. region:RegionId,
  169. s3ForcePathStyle:S3ForceStyle,
  170. credentials:{
  171. accessKeyId:AccessKeyId,
  172. secretAccessKey:AccessKeySecret,
  173. }
  174. })
  175. try {
  176. let reader = new FileReader();
  177. reader.readAsArrayBuffer(file);
  178. reader.onloadend = function (e) {
  179. const dataurl = e.target.result;
  180. let bufferStream = new stream.PassThrough();
  181. bufferStream.end(Buffer.from(dataurl))
  182. //upload会返回完整路径
  183. s3Client.upload({
  184. Bucket: Bucketname,
  185. ContentType: file.type || 'application/octet-stream',
  186. Body: file,
  187. ACL: "public-read",
  188. Key: fileName
  189. }, function (err, data) {
  190. if (err) {
  191. console.log("Error! err =====> ", err);
  192. throw new Error("上传到s3失败!")
  193. } else {
  194. let url = data['Location'];
  195. console.log("Successfully uploaded! URL =====> ", url);
  196. return url
  197. }
  198. });
  199. }
  200. } catch (error) {
  201. console.error(error);
  202. if (error.name !== "cancel") {
  203. //不是取消上传的则给错误提示
  204. console.log("上传失败,请刷新重试");
  205. }
  206. }
  207. }