123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- const request_1 = __importDefault(require("request"));
- const fs_1 = __importDefault(require("fs"));
- const httpRequest_1 = __importDefault(require("../utils/httpRequest"));
- const xml2js_1 = require("xml2js");
- const utils_1 = require("../utils/utils");
- const code_1 = require("../const/code");
- const cloudbase_1 = require("../cloudbase");
- async function parseXML(str) {
- return new Promise((resolve, reject) => {
- xml2js_1.parseString(str, (err, result) => {
- if (err) {
- reject(err);
- }
- else {
- resolve(result);
- }
- });
- });
- }
- exports.parseXML = parseXML;
- /*
- * 上传文件
- * @param {string} cloudPath 上传后的文件路径
- * @param {fs.ReadStream} fileContent 上传文件的二进制流
- */
- async function uploadFile(cloudbase, { cloudPath, fileContent }, opts) {
- const { data: { url, token, authorization, fileId, cosFileId } } = await getUploadMetadata(cloudbase, { cloudPath }, opts);
- const formData = {
- Signature: authorization,
- 'x-cos-security-token': token,
- 'x-cos-meta-fileid': cosFileId,
- key: cloudPath,
- file: fileContent
- };
- let body = await new Promise((resolve, reject) => {
- request_1.default({ url, formData: formData, method: 'post' }, function (err, res, body) {
- if (err) {
- reject(err);
- }
- else {
- resolve(body);
- }
- });
- });
- body = await parseXML(body);
- if (body && body.Error) {
- const { Code: [code], Message: [message] } = body.Error;
- if (code === 'SignatureDoesNotMatch') {
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, code_1.ERROR.SYS_ERR, { message }));
- }
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, code_1.ERROR.STORAGE_REQUEST_FAIL, { message }));
- }
- return {
- fileID: fileId
- };
- }
- exports.uploadFile = uploadFile;
- /**
- * 删除文件
- * @param {Array.<string>} fileList 文件id数组
- */
- async function deleteFile(cloudbase, { fileList }, opts) {
- if (!fileList || !Array.isArray(fileList)) {
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: 'fileList必须是非空的数组' }));
- }
- for (let file of fileList) {
- if (!file || typeof file !== 'string') {
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: 'fileList的元素必须是非空的字符串' }));
- }
- }
- let params = {
- action: 'storage.batchDeleteFile',
- fileid_list: fileList
- };
- return httpRequest_1.default({
- config: cloudbase.config,
- params,
- method: 'post',
- opts,
- headers: {
- 'content-type': 'application/json'
- }
- }).then(res => {
- if (res.code) {
- return res;
- }
- // throw E({ ...res })
- // } else {
- return {
- fileList: res.data.delete_list,
- requestId: res.requestId
- };
- // }
- });
- }
- exports.deleteFile = deleteFile;
- /**
- * 获取文件下载链接
- * @param {Array.<Object>} fileList
- */
- async function getTempFileURL(cloudbase, { fileList }, opts) {
- if (!fileList || !Array.isArray(fileList)) {
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: 'fileList必须是非空的数组' }));
- }
- let file_list = [];
- for (let file of fileList) {
- if (typeof file === 'object') {
- if (!file.hasOwnProperty('fileID') || !file.hasOwnProperty('maxAge')) {
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: 'fileList的元素如果是对象,必须是包含fileID和maxAge的对象' }));
- }
- file_list.push({
- fileid: file.fileID,
- max_age: file.maxAge
- });
- }
- else if (typeof file === 'string') {
- file_list.push({
- fileid: file
- });
- }
- else {
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: 'fileList的元素如果不是对象,则必须是字符串' }));
- }
- }
- let params = {
- action: 'storage.batchGetDownloadUrl',
- file_list
- };
- // console.log(params);
- return httpRequest_1.default({
- config: cloudbase.config,
- params,
- method: 'post',
- opts,
- headers: {
- 'content-type': 'application/json'
- }
- }).then(res => {
- if (res.code) {
- return res;
- }
- // if (res.code) {
- // throw E({ ...res })
- // } else {
- return {
- fileList: res.data.download_list,
- requestId: res.requestId
- };
- // }
- });
- }
- exports.getTempFileURL = getTempFileURL;
- async function downloadFile(cloudbase, params, opts) {
- let tmpUrl;
- const { fileID, tempFilePath } = params;
- const tmpUrlRes = await getTempFileURL(cloudbase, {
- fileList: [
- {
- fileID,
- maxAge: 600
- }
- ]
- }, opts);
- // console.log(tmpUrlRes);
- const res = tmpUrlRes.fileList[0];
- if (res.code !== 'SUCCESS') {
- return utils_1.processReturn(cloudbase.config.throwOnCode, Object.assign({}, res));
- }
- tmpUrl = res.tempFileURL;
- tmpUrl = encodeURI(tmpUrl);
- let req = request_1.default({
- url: tmpUrl,
- encoding: null,
- proxy: cloudbase.config.proxy
- });
- return new Promise((resolve, reject) => {
- let fileContent = Buffer.alloc(0);
- req.on('response', function (response) {
- /* istanbul ignore else */
- if (response && Number(response.statusCode) === 200) {
- if (tempFilePath) {
- response.pipe(fs_1.default.createWriteStream(tempFilePath));
- }
- else {
- response.on('data', data => {
- fileContent = Buffer.concat([fileContent, data]);
- });
- }
- response.on('end', () => {
- resolve({
- fileContent: tempFilePath ? undefined : fileContent,
- message: '文件下载完成'
- });
- });
- }
- else {
- reject(response);
- }
- });
- });
- }
- exports.downloadFile = downloadFile;
- async function getUploadMetadata(cloudbase, { cloudPath }, opts) {
- let params = {
- action: 'storage.getUploadMetadata',
- path: cloudPath
- };
- const res = await httpRequest_1.default({
- config: cloudbase.config,
- params,
- method: 'post',
- opts,
- headers: {
- 'content-type': 'application/json'
- }
- });
- // if (res.code) {
- // throw E({
- // ...ERROR.STORAGE_REQUEST_FAIL,
- // message: 'get upload metadata failed: ' + res.code
- // })
- // } else {
- return res;
- // }
- }
- exports.getUploadMetadata = getUploadMetadata;
- async function getFileAuthority(cloudbase, { fileList }, opts) {
- const { LOGINTYPE } = cloudbase_1.CloudBase.getCloudbaseContext();
- if (!Array.isArray(fileList)) {
- throw utils_1.E(Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: '[node-sdk] getCosFileAuthority fileList must be a array' }));
- }
- if (fileList.some(file => {
- if (!file || !file.path) {
- return true;
- }
- if (['READ', 'WRITE', 'READWRITE'].indexOf(file.type) === -1) {
- return true;
- }
- return false;
- })) {
- throw utils_1.E(Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: '[node-sdk] getCosFileAuthority fileList param error' }));
- }
- const userInfo = cloudbase.auth().getUserInfo();
- const { openId, uid } = userInfo;
- if (!openId && !uid) {
- throw utils_1.E(Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: '[node-sdk] admin do not need getCosFileAuthority.' }));
- }
- let params = {
- action: 'storage.getFileAuthority',
- openId,
- uid,
- loginType: LOGINTYPE,
- fileList
- };
- const res = await httpRequest_1.default({
- config: cloudbase.config,
- params,
- method: 'post',
- headers: {
- 'content-type': 'application/json'
- }
- });
- if (res.code) {
- /* istanbul ignore next */
- throw utils_1.E(Object.assign({}, res, { message: '[node-sdk] getCosFileAuthority failed: ' + res.code }));
- }
- else {
- return res;
- }
- }
- exports.getFileAuthority = getFileAuthority;
|