· 6 years ago · Sep 17, 2019, 01:44 AM
1
2var fsp = require('fs-promise');
3var Bluebird = require('bluebird');
4var MinioLib = require('minio')
5
6var config = require('../config/config_minio');
7const logger = console.log;
8
9//const Minio = new MinioClient(config.minio)
10const Minio = new MinioLib.Client({
11 endPoint: '',
12 port: 0,
13 useSSL: false,
14 accessKey: '',
15 secretKey: ''
16});
17
18Bluebird.promisifyAll(Object.getPrototypeOf(Minio));
19
20
21// Check whether object matchs with S3 object naming conventions
22// http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
23// In my use case:
24// 1. removing / at begining
25// 2. lowercase
26function qualifyObject(bucketName) {
27 let bucket = bucketName;
28
29 if (typeof bucket === 'string' && bucket[0] === '/') {
30 bucket = bucket.slice(1);
31 }
32 console.log('qualifyObject', bucket.toLowerCase())
33 return bucket.toLowerCase();
34}
35
36/**
37 * https://docs.minio.io/docs/javascript-client-api-reference#putObject
38 * Upload buffer using Minio.putObject
39 * @param {Object} minioObject
40 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
41 * @param {string} minioObject.object Object Name to Save
42 * @param {buffer} minioObject.buffer Buffer to Store
43 * @return {Promise.<string>} returns etag of the object uploaded.
44 */
45
46Minio.bufferUpload = (minioObject) => {
47 const minObj = minioObject;
48 minObj.bucket = minObj.bucket || 'default'; // Bucket name always in lowercaseObj
49 // - https://docs.minio.io/docs/javascript-client-api-reference#putObject
50 return Minio.putObjectAsync(minObj.bucket, minObj.object,
51 minObj.buffer, 'application/octet-stream');
52}
53
54/**
55 * https://docs.minio.io/docs/javascript-client-api-reference#putObject
56 * Upload base64 String using Minio.putObject
57 * @param {Object} minioObject
58 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
59 * @param {string} minioObject.object Object Name to Save
60 * @param {string} minioObject.base64String Base64 String to Store
61 * @return {Promise.<string>} returns etag of the object uploaded.
62 */
63
64Minio.base64Upload = (minioObject) => {
65 const minObj = minioObject;
66
67 let base64String = minioObject.base64String.split(';base64,').pop();
68 minObj.buffer = Buffer.from(base64String, 'base64');
69 return Minio.bufferUpload(minObj);
70}
71
72/**
73 * https://docs.minio.io/docs/javascript-client-api-reference#putObject
74 * Upload base64 String using Minio.putObject
75 * @param {Array} minioObjects Array of Base Minio Objects to Upload
76 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
77 * @param {string} minioObject.object Object Name to Save
78 * @param {string} minioObject.base64String Base64 String to Store
79 * @return {Promise.<Array>} returns Array of etag of the object uploaded.
80 */
81
82Minio.base64UploadMulti = (minioObjects) => {
83 return Promise.all(minioObjects.map(m => Minio.base64Upload(m)));
84}
85
86
87/**
88 * https://docs.minio.io/docs/javascript-client-api-reference#presignedGetObject
89 * Generate Link to download or view object or file stored in Minio
90 * @param minioObject
91 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
92 * @param {string} minioObject.object Object Name for Download URL Generation
93 * @param {number} minioObject.expires Time for Link Expiry
94 * @returns {Promise.<Array>} returns link to download or view file.
95 * In my case: Mostly PDF
96 */
97
98Minio.viewLink = (minioObject) => {
99 const minObj = minioObject;
100 minObj.bucket = minObj.bucket || 'default'; // Bucket name always in lowercaseObj
101 minObj.expires = minObj.expires || 24 * 60 * 60; // Expired in one day
102 console.log(minObj.object)
103 console.log(`${config.minio.endPoint}api.${config.minio.domain}/api/404.pdf`)
104 if (!minObj.object) {
105 return Promise.resolve(`${config.endPoint}api.${config.domain}/api/404.pdf`);
106 }
107 return Minio.statObjectAsync(minObj.bucket, qualifyObject(minObj.object))
108 .then(() => Minio
109 .presignedGetObjectAsync(minObj.bucket, qualifyObject(minObj.object), minObj.expires))
110 .catch(() => {
111 console.log('Minio: View File not found', minObj)
112 return `${config.PREFIX}api.${config.DOMAIN}/api/404.pdf`;
113 });
114}
115
116/**
117 * https://docs.minio.io/docs/javascript-client-api-reference#presignedGetObject
118 * Generate Link with content-disposition header. Force download minio object
119 * @param minioObject
120 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
121 * @param {string} minioObject.object Object Name for Download URL Generation
122 * @param {number} minioObject.expires Time for Link Expiry
123 * @returns {Promise.<Array>} returns link to download or view file.
124 */
125
126Minio.downloadLinkBase = (minioObject) => {
127 const minObj = minioObject;
128 minObj.bucket = minObj.bucket || 'default'; // Bucket name always in lowercaseObj
129 minObj.expires = minObj.expires || 24 * 60 * 60; // Expired in one day
130 minObj.headers = {
131 'response-content-disposition':
132 `attachment; filename="${minObj.name.replace(/[^a-zA-Z0-9-_\.]/g, '')}"`
133 };
134
135 return Minio.presignedGetObjectAsync(
136 minObj.bucket.toLowerCase(), qualifyObject(minObj.object),
137 minObj.expires, minObj.headers
138 );
139};
140
141/**
142 * https://docs.minio.io/docs/javascript-client-api-reference#presignedGetObject
143 * Generate Link with content-disposition header. Force download minio object
144 * https://docs.minio.io/docs/javascript-client-api-reference#statObject
145 * Check whether file exist in Minio
146 * @param minioObject
147 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
148 * @param {string} minioObject.object Object Name for Download URL Generation
149 * @param {number} minioObject.expires Time for Link Expiry
150 * @returns {Promise.<Array>} returns link to download or view file.
151 */
152
153Minio.downloadLink = (minioObject) => {
154 const minObj = minioObject;
155 minObj.bucket = minObj.bucket || 'default'; // Bucket name always in lowercase
156 console.log('HEREE downloadLink', minioObject)
157 return Minio.statObjectAsync(minObj.bucket, qualifyObject(minObj.object))
158 .then(() => Minio.downloadLinkBase(minObj))
159 .catch(() => {
160 console.log('Minio: File not found', minObj)
161 return `${config.PREFIX}api.${config.DOMAIN}/api/404.pdf`;
162 });
163};
164
165
166/**
167 * https://docs.minio.io/docs/javascript-client-api-reference#presignedPostPolicy
168 * Generate Presigned Link to Upload file directly to Minio.
169 * @param minioObject
170 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
171 * @param {string} minioObject.object Object Name for Download URL Generation
172 * @param {number} minioObject.expires Time for Link Expiry
173 * @returns {Promise.<string>} returns http url to upload file using HTTP POST.
174 */
175
176Minio.uploadLink = (minioObject) => {
177 const minObj = minioObject;
178 minObj.bucket = minObj.bucket || 'default'; // Bucket name always in lowercaseObj
179 minObj.expires = minObj.expires || 24 * 60 * 60; // Expired in one day
180 return Minio.presignedPostObjectAsync(
181 minObj.bucket, qualifyObject(minObj.object), minObj.expires);
182};
183
184/**
185 * https://docs.minio.io/docs/javascript-client-api-reference#putObject
186 * Transfer file from temp to Minio using Minio.putObject()
187 * @param minioObject
188 * @param {string} [minioObject.bucket] Minio Bucket | optional | default:
189 * @param {string} minioObject.temp temporary file path.
190 * @param {string} minioObject.object Object Name for Download URL Generation
191 * @returns {Promise.<string>} returns etag of the object uploaded
192 */
193
194Minio.uploadTemp = (minioObject) => {
195 const minObj = minioObject;
196 const fileStream = fsp.createReadStream(minioObject.temp)
197 return fsp.stat(minioObject.temp).then(stats => Minio
198 .putObjectAsync('default', minObj.object, fileStream, stats.size, 'application/octet-stream'));
199}
200
201module.exports = Minio;