|
|
- const fs = require('fs');
- const is = require('is-type-of');
- const { isObject } = require('../utils/isObject');
-
- const proto = exports;
- /**
- * get
- * @param {String} name - object name
- * @param {String | Stream | Object} file - file path or file stream or options
- * @param {Object} options
- * @param {{res}}
- */
- proto.get = async function get(name, file, options = {}) {
- let writeStream = null;
- let needDestroy = false;
-
- if (is.writableStream(file)) {
- writeStream = file;
- } else if (is.string(file)) {
- writeStream = fs.createWriteStream(file);
- needDestroy = true;
- } else if (isObject(file)) {
- // get(name, options)
- options = file;
- }
-
- options = options || {};
- const isBrowserEnv = process && process.browser;
- const responseCacheControl = options.responseCacheControl === null ? '' : 'no-cache';
- const defaultSubresOptions =
- isBrowserEnv && responseCacheControl ? { 'response-cache-control': responseCacheControl } : {};
- options.subres = Object.assign(defaultSubresOptions, options.subres);
-
- if (options.versionId) {
- options.subres.versionId = options.versionId;
- }
- if (options.process) {
- options.subres['x-oss-process'] = options.process;
- }
-
- let result;
- try {
- const params = this._objectRequestParams('GET', name, options);
- params.writeStream = writeStream;
- params.successStatuses = [200, 206, 304];
-
- result = await this.request(params);
-
- if (needDestroy) {
- writeStream.destroy();
- }
- } catch (err) {
- if (needDestroy) {
- writeStream.destroy();
- // should delete the exists file before throw error
- await this._deleteFileSafe(file);
- }
- throw err;
- }
-
- return {
- res: result.res,
- content: result.data
- };
- };
|