Browse Source

feat: file with decode key

ryanemax 5 months ago
parent
commit
f8a6d5024b

+ 7 - 3
projects/textbook/src/app/comp-upload/provider-oss-aliyun.ts

@@ -96,7 +96,8 @@ export class ProvierOssAli{
         await this.initClient();
         let urlObj = new URL(url)
         // let r1 = await this.client?.get(fname, file, putOptions);
-        let r1 = await this.client?.signatureUrl(urlObj.pathname, {
+        let fileKey = decodeURIComponent(urlObj.pathname)
+        let r1 = await this.client?.signatureUrl(fileKey, {
              expires: expires,
         });
         console.log(r1)
@@ -106,13 +107,16 @@ export class ProvierOssAli{
     async setACLPrivate(url:string){
         await this.initClient();
         let urlObj = new URL(url);
-        let r1 = await this.client?.putACL(urlObj.pathname,"private")
+        console.log(url,urlObj.pathname)
+        let fileKey = decodeURIComponent(urlObj.pathname)
+        let r1 = await this.client?.putACL(fileKey,"private")
         return r1
     }
     async setACLPublic(url:string){
         await this.initClient();
         let urlObj = new URL(url);
-        let r1 = await this.client?.putACL(urlObj.pathname,"public-read-write")
+        let fileKey = decodeURIComponent(urlObj.pathname)
+        let r1 = await this.client?.putACL(fileKey,"public-read-write")
         return r1
     }
 

+ 27 - 2
server/cloud/aliyun/func-aliyun-oss.js

@@ -30,13 +30,24 @@ const ALI_OSS_BUCKET_SECRET = process.env.ALI_OSS_BUCKET || "hep-textbook"
 // AccessKey Secret: KLtQRdIW69KLP7jnzHNUf7eKmdptxH
 
 // 通过STS服务生成临时访问凭证。临时访问凭证包括临时访问密钥(AccessKeyId和AccessKeySecret)和安全令牌(SecurityToken)。
-const { STS } = require('ali-oss');
+const { STS,OSS } = require('ali-oss');
 const sts = new STS({
     // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量ALI_OSS_ACCESS_KEY_ID和ALI_OSS_ACCESS_KEY_SECRET。
     accessKeyId: ALI_OSS_ACCESS_KEY_ID,
     accessKeySecret: ALI_OSS_ACCESS_KEY_SECRET
   });
 
+const ossClient = new OSS({
+    // yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
+    region: "oss-cn-beijing",
+    // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
+    accessKeyId: ALI_OSS_ACCESS_KEY_ID,
+    accessKeySecret: ALI_OSS_ACCESS_KEY_SECRET,
+    // 填写Bucket名称。
+    bucket: result?.ALI_OSS_BUCKET || "hep-textbook",
+    timeout:5000*1000
+});
+
 
 function getAliyunOssAccessToken(){
 
@@ -77,4 +88,18 @@ function getAliyunOssAccessToken(){
 module.exports.getAliyunOssAccessToken = getAliyunOssAccessToken
 if(argv?.test){
     getAliyunOssAccessToken()
-}
+}
+
+ // 获取临时签名地址
+async function signatureUrl(url,options){
+    let expires = options?.expires || 600 // 默认10分钟
+    let urlObj = new URL(url)
+    let fileKey = decodeURIComponent(urlObj.pathname)
+    // let r1 = await this.client?.get(fname, file, putOptions);
+    let r1 = await ossClient?.signatureUrl(fileKey, {
+         expires: expires,
+    });
+    console.log(r1)
+    return r1;
+}
+module.exports.signatureUrl = signatureUrl

+ 28 - 0
server/lib/docs/index.js

@@ -26,6 +26,28 @@ const ALI_OSS_BUCKET = process.env.ALI_OSS_BUCKET || "hep-textbook"
 const ALI_OSS_ACCESS_KEY_ID = process.env.ALI_OSS_ACCESS_KEY_ID || "LTAI5t6AbTiAvXmeoVdJZhL3"
 const ALI_OSS_ACCESS_KEY_SECRET = process.env.ALI_OSS_ACCESS_KEY_SECRET || "KLtQRdIW69KLP7jnzHNUf7eKmdptxH"
 
+const ossClient = new OSS({
+    // yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
+    region: "oss-cn-beijing",
+    accessKeyId: ALI_OSS_ACCESS_KEY_ID,
+    accessKeySecret: ALI_OSS_ACCESS_KEY_SECRET,
+    // 填写Bucket名称。
+    bucket: ALI_OSS_BUCKET || "hep-textbook",
+    timeout:5000*1000
+});
+ // 获取临时签名地址
+ async function signatureUrl(url,options){
+    let expires = options?.expires || 600 // 默认10分钟
+    let urlObj = new URL(url)
+    // let r1 = await this.client?.get(fname, file, putOptions);
+    let fileKey = decodeURIComponent(urlObj.pathname)
+    let r1 = await ossClient?.signatureUrl(fileKey, {
+         expires: expires,
+    });
+    console.log(r1)
+    return r1;
+}
+
 const bwipjs = require("bwip-js")
 export async function toBarCode(text){
     return new Promise(resolve=>{
@@ -128,6 +150,12 @@ module.exports.createZip = createZip
 
 const download = require('download')
 export async function downloadUrl(url,options) {
+    // OSS权限校验
+    let response = await fetch(url)
+    console.log(url)
+    if(response?.status==403){
+        url = await signatureUrl(url);
+    }
     // console.log(url)
     if(!fs.existsSync(options?.tempDir)) fs.mkdirSync(options?.tempDir);
     // console.log(url)