11import fetch from "./fetch" ;
2+ import CryptoJS from "crypto-js" ;
23import OSS from "ali-oss" ;
34import COS from "cos-js-sdk-v5" ;
45import Buffer from "buffer-from" ;
56import { v4 as uuidv4 } from "uuid" ;
7+ import * as qiniu from "qiniu-js" ;
8+ import { utf16to8 , base64encode , safe64 } from "../assets/scripts/tokenTools" ;
69
710const defaultConfig = {
811 username : "filess" ,
@@ -28,6 +31,8 @@ function fileUpload(content, file) {
2831 return aliOSSFileUpload ( content , file . name ) ;
2932 case "txCOS" :
3033 return txCOSFileUpload ( file ) ;
34+ case "qiniu" :
35+ return qiniuUpload ( file ) ;
3136 case "github" :
3237 default :
3338 return ghFileUpload ( content , file . name ) ;
@@ -81,6 +86,14 @@ function getGitHubConfig() {
8186 ) ;
8287}
8388
89+ function getQiniuToken ( accessKey , secretKey , putPolicy ) {
90+ const policy = JSON . stringify ( putPolicy ) ;
91+ const encoded = base64encode ( utf16to8 ( policy ) ) ;
92+ const hash = CryptoJS . HmacSHA1 ( encoded , secretKey ) ;
93+ const encodedSigned = hash . toString ( CryptoJS . enc . Base64 ) ;
94+ return accessKey + ":" + safe64 ( encodedSigned ) + ":" + encoded ;
95+ }
96+
8497async function ghFileUpload ( content , filename ) {
8598 const isDefault = localStorage . getItem ( "imgHost" ) !== "github" ;
8699 const config = isDefault ? getDefaultConfig ( ) : getGitHubConfig ( ) ;
@@ -166,6 +179,44 @@ async function txCOSFileUpload(file) {
166179 } ) ;
167180}
168181
182+ async function qiniuUpload ( file ) {
183+ const qiniuConfig = JSON . parse ( localStorage . getItem ( "qiniuConfig" ) ) ;
184+ const putPolicy = {
185+ scope : qiniuConfig . bucket ,
186+ deadline : Math . trunc ( new Date ( ) . getTime ( ) / 1000 ) + 3600 ,
187+ } ;
188+ const token = getQiniuToken (
189+ qiniuConfig . accessKey ,
190+ qiniuConfig . secretKey ,
191+ putPolicy
192+ ) ;
193+ const dir = qiniuConfig . path ? qiniuConfig . path + "/" : "" ;
194+ const dateFilename =
195+ dir +
196+ new Date ( ) . getTime ( ) +
197+ "-" +
198+ uuidv4 ( ) +
199+ "." +
200+ file . name . split ( "." ) [ 1 ] ;
201+ const config = {
202+ region : qiniuConfig . region ,
203+ } ;
204+ const observable = qiniu . upload ( file , dateFilename , token , { } , config ) ;
205+ return new Promise ( ( resolve , reject ) => {
206+ observable . subscribe ( {
207+ next : ( result ) => {
208+ console . log ( result ) ;
209+ } ,
210+ error : ( err ) => {
211+ reject ( err . message ) ;
212+ } ,
213+ complete : ( result ) => {
214+ resolve ( qiniuConfig . domain + "/" + result . key ) ;
215+ } ,
216+ } ) ;
217+ } ) ;
218+ }
219+
169220export default {
170221 fileUpload,
171222} ;
0 commit comments