Sfoglia il codice sorgente

minio上传文件,但好像不行

cxmo 1 anno fa
parent
commit
c3e6bc90cc
4 ha cambiato i file con 128 aggiunte e 5 eliminazioni
  1. 1 0
      package.json
  2. 3 2
      src/api/common.js
  3. 91 1
      src/hooks/useUploadFileToOSS.js
  4. 33 2
      src/views/ppt/hooks/usePPTPublish.js

+ 1 - 0
package.json

@@ -23,6 +23,7 @@
     "js-base64": "^3.7.5",
     "js-md5": "^0.7.3",
     "lodash": "^4.17.21",
+    "minio": "^7.0.18",
     "moment": "^2.29.4",
     "normalize.css": "^8.0.1",
     "pinia": "^2.0.36",

+ 3 - 2
src/api/common.js

@@ -20,9 +20,10 @@ export function apiReportingErrInfo(params){
 
 /**
  * 获取oss临时签名
+ * @param {*} params.StorageSource number 1:oss 2:minio
  */
-export function apiGetOSSSign(){
-    return get('/resource/oss/get_sts_token',{})
+export function apiGetOSSSign(params){
+    return get('/resource/oss/get_sts_token',params)
 }
 
 /**

+ 91 - 1
src/hooks/useUploadFileToOSS.js

@@ -1,6 +1,10 @@
 // 上传文件到阿里云oss
 import OSS from 'ali-oss'
 import {apiGetOSSSign} from '@/api/common'
+/* import { createRequire } from 'module'
+const require = createRequire(import.meta.url)
+const Minio = require('minio')
+const stream = require('stream') */
 
 /**
  * 上传到oss
@@ -10,7 +14,7 @@ import {apiGetOSSSign} from '@/api/common'
  * @returns fileUrl 返回文件在阿里云上的地址
  */
 export async function useUploadFileToOSS(data,fileName,isMultipart=false){
-    const signRes=await apiGetOSSSign()
+    const signRes=await apiGetOSSSign({StorageSource:1})
     if(signRes.Ret!==200) return
     const accessKeyId=signRes.Data.AccessKeyId
     const accessKeySecret=signRes.Data.AccessKeySecret
@@ -60,4 +64,90 @@ export async function useUploadFileToOSS(data,fileName,isMultipart=false){
     
 
     return resUrl
+}
+
+//上传到minio
+// minio sdk 文档 https://min.io/docs/minio/linux/developers/javascript/API.html
+export async function useUploadToMinIO (file, fileName, options = {}){
+    const res = await apiGetOSSSign({StorageSource:2})
+    if (res.Ret !== 200) {
+        console.log("获取minio临时签名错误,res.Ret=" + res.Ret)
+        return
+    }
+    const minioClient = new Minio.Client({
+        endPoint: res.Data.Endpoint.split(':')[0],
+        port: Number(res.Data.Port) || undefined,
+        useSSL: res.Data.UseSSL.toLocaleLowerCase() == "false" ? false : true,
+        accessKey: res.Data.AccessKeyId,
+        secretKey: res.Data.SecretKeyId,
+    })
+    console.log(minioClient);
+    try {
+        var metaData = {
+            ...{
+                'Content-Type': file.type || 'application/octet-stream',
+                "Content-Length": file.size,
+            },
+            ...options
+        }
+
+        minioClient.bucketExists(res.Data.Bucketname, function (err, exists) {
+            if (err) {
+                return console.log("minio 查看桶是否存在失败" + err)
+            }
+            if (!exists) {
+                // 不存在桶,创建桶
+                console.log("桶不存在,先创建桶", res.Data.Bucketname);
+                minioClient.makeBucket(res.Data.Bucketname, res.Data.RegionId, function (err) {
+                    if (err) {
+                        console.log("minio 创建桶失败" + err)
+                        return 
+                    }
+                    let reader = new FileReader();
+                    // console.log(reader);
+                    reader.readAsArrayBuffer(file);
+                    reader.onloadend = function (e) {
+                        const dataurl = e.target.result;
+                        let bufferStream = new stream.PassThrough();
+                        // 转化成数据流  minio接受数据流格式
+                        bufferStream.end(Buffer.from(dataurl))
+                        // console.log(bufferStream);
+                        minioClient.putObject(res.Data.Bucketname, fileName, bufferStream, file.size, metaData, function (err, etag) {
+                            if (err) {
+                                return console.log("上传到minio失败:" + err)
+                            }
+                            let fileUrl = fileName.startsWith('/') ? res.Data.ImgHost + fileName : res.Data.ImgHost + "/" + fileName
+                            return fileUrl
+                        })
+                    }
+                })
+            }
+            if (exists) {
+                // console.log("桶存在",res.Data.Bucketname);
+                let reader = new FileReader();
+                console.log(reader);
+                reader.readAsArrayBuffer(file);
+                reader.onloadend = function (e) {
+                    const dataurl = e.target.result;
+                    let bufferStream = new stream.PassThrough();
+
+                    bufferStream.end(Buffer.from(dataurl))
+                    minioClient.putObject(res.Data.Bucketname, fileName, bufferStream, metaData, function (err, etag) {
+                        if (err) {
+                            console.log("上传到minio失败:" + err)
+                            return 
+                        }
+                        let fileUrl = fileName.startsWith('/') ? res.Data.ImgHost + fileName : res.Data.ImgHost + "/" + fileName
+                        return fileUrl
+                    })
+                }
+            }
+        })
+    } catch (error) {
+        console.error(error);
+        if (error.name !== "cancel") {
+            //不是取消上传的则给错误提示
+            this.$message.warning("上传失败,请刷新重试");
+        }
+    }
 }

+ 33 - 2
src/views/ppt/hooks/usePPTPublish.js

@@ -6,9 +6,12 @@ import pptxgen from "pptxgenjs";
 import { parse } from "himalaya";
 import _ from 'lodash'
 import {pptLayout,pptSlideMaster,pptSlideMasterEn,modelConfig} from '../utils/config'
-import {useUploadFileToOSS} from '@/hooks/useUploadFileToOSS'
+import {useUploadFileToOSS,useUploadToMinIO} from '@/hooks/useUploadFileToOSS'
+import {usePublicSettingStore} from '@/store/modules/publicSetting'
 import moment from 'moment'
 
+const publicSettingStore = usePublicSettingStore()
+
 let LoadingINS=null
 let PPTContentList=[]
 let pptId=0
@@ -430,6 +433,28 @@ async function handleUploadToOSS(data){
 	}
 	handlePublishPPT(url)
 }
+// 上传到minio
+async function handleUploadToMinIO(data){
+    const loading=showLoadingToast({
+        message: "上传中...",
+        duration: 0,
+        forbidClick: true,
+      })
+    const t=new Date()
+	const month=moment(t).format('YYYYMM')
+	const day=moment(t).format('YYYYMMDD')
+	const temName=`ppt/${month}/${day}/${createRandomCode(32)}.pptx`
+	console.log('文件名',temName);
+    const url = await useUploadToMinIO(data,temName)
+    loading.close()
+    if(!url){
+        setTimeout(() => {
+            showToast('生成ppt失败')
+        }, 60);
+        return
+    }
+    handlePublishPPT(url)
+}
 
 // 页面转ppt
 async function pageToPPT(){
@@ -632,7 +657,12 @@ async function pageToPPT(){
     }
     pptx2.write('blob').then((data)=>{
       LoadingINS.close()
-      // 上传到阿里云oss
+      /* if(publicSettingStore.publicSetting.ObjectStorageClient==='minio'){
+        //上传到minio
+        handleUploadToMinIO(data)
+      }else{
+        handleUploadToOSS(data)
+      } */
       handleUploadToOSS(data)
     })
     // pptx2.writeFile({ fileName: "test.pptx" }) //本地测试可直接用该方法生成ppt文件
@@ -670,5 +700,6 @@ export async function usePPTPublish(data,id){
         duration: 0,
         forbidClick: true,
     })
+    await publicSettingStore.getPublicSetting()
     pageToPPT()
 }