@mediasuite/cloud-storage
Version:
upload and download files from various providers
64 lines (57 loc) • 1.82 kB
JavaScript
const fs = require('fs')
const path = require('path')
const stream = require('stream')
const Readable = stream.Readable
module.exports = config => {
// use config for setup here
let storagePath = config.path
let normalizedPath = path.normalize(`${storagePath}/`)
return {
name: 'filesystem',
upload (name, data, options) {
return new Promise((resolve, reject) => {
const response = {
key: name,
ContentType: options.ContentType
}
const writeStream = fs.createWriteStream(`${normalizedPath}${name}`)
writeStream.on('error', err => reject(err))
writeStream.on('finish', () => {
if (/^image\/.*/.test(options.ContentType)) {
if (options.isThumb) response.isThumb = true
response.width = options.meta.width
response.height = options.meta.height
}
return resolve(response)
})
if (data instanceof stream.Stream) {
data.pipe(writeStream)
} else {
let stream = new Readable()
stream._read = () => {
stream.push(data)
stream.push(null)
}
stream.on('error', err => reject(err))
stream.pipe(writeStream)
}
})
},
download (name, options) {
return new Promise((resolve, reject) => {
let stream = fs.createReadStream(`${normalizedPath}${name}`)
switch (options.type) {
case 'buffer':
let data = Buffer.from('')
stream.on('data', chunk => { data = Buffer.concat([data, chunk]) })
stream.on('end', () => resolve(data))
stream.on('error', err => reject(err))
break
default:
return resolve(stream)
}
})
}
}
}