fs-extra#Stats TypeScript Examples

The following examples show how to use fs-extra#Stats. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: storage.ts    From ass with ISC License 4 votes vote down vote up
export function processUploaded(req: Request, res: Response, next: Function) { // skipcq: JS-0045
	// Fix file object
	req.file = req.files.file;

	// Other fixes
	req.file.ext = '.'.concat((req.file.filename ?? '').split('.').pop() ?? '');
	req.file.originalname = req.file.filename ?? '';
	req.file.path = req.file.file ?? '';
	req.file.randomId = generateId('random', ID_GEN_LENGTH, 0, '');
	req.file.deleteId = generateId('random', ID_GEN_LENGTH, 0, '');

	// Set up types
	req.file.is = {
		image: false,
		video: false,
		audio: false,
		other: false
	};

	// Specify correct type
	const isType = req.file!.mimetype.includes('image') ? 'image' : req.file.mimetype.includes('video') ? 'video' : req.file.mimetype.includes('audio') ? 'audio' : 'other';
	req.file.is[isType] = true;

	// Block the resource if the mimetype is not an image or video
	if (mediaStrict && !ALLOWED_MIMETYPES.test(req.file.mimetype))
		return log
			.warn('Upload blocked', req.file.originalname, req.file.mimetype)
			.warn('Strict media mode', 'only images, videos, & audio are file permitted')
			.callback(() =>
				fs.remove(req.file.path)
					.then(() => log
						.debug('Temp file', 'deleted')
						.callback(() => res.sendStatus(CODE_UNSUPPORTED_MEDIA_TYPE)))
					.catch((err) => log
						.error('Temp file could not be deleted', err)
						.callback(next, err)));

	// Remove unwanted fields
	delete req.file.uuid;
	delete req.file.field;
	delete req.file.file;
	delete req.file.filename;
	delete req.file.truncated;
	delete req.file.done;

	// Temp file name used in case file already exists (long story; just don't touch this)
	let tempFileName = '';

	// Operations
	// @ts-ignore
	Promise.all([Thumbnail(req.file), Vibrant(req.file), Hash(req.file), fs.stat(req.file.path)])
		// skipcq: JS-0086
		.then(([thumbnail, vibrant, sha1, stat]: [string, string, string, Stats]) => (
			req.file.thumbnail = thumbnail, // skipcq: JS-0090
			req.file.vibrant = vibrant, // skipcq: JS-0090
			req.file.sha1 = sha1, // skipcq: JS-0090
			req.file.size = stat.size // skipcq: JS-0090
		))

		// Check if file size is too big
		.then(() => { if (req.file.size / Math.pow(1024, 2) > maxUploadSize) throw new Error('LIMIT_FILE_SIZE'); })

		// Save file
		.then(() => log.debug('Saving file', req.file.originalname, s3enabled ? 'in S3' : useSia ? 'on Sia blockchain' : 'on disk'))
		.then(() =>
			// skipcq: JS-0229
			new Promise((resolve, reject) => {

				// Upload to Amazon S3
				if (s3enabled) return s3.putObject({
					Bucket: s3bucket,
					Key: req.file.randomId.concat(req.file.ext),
					ACL: 'public-read',
					ContentType: req.file.mimetype,
					Body: fs.createReadStream(req.file.path)
				}).promise().then(resolve).catch(reject);

				// Use Sia Skynet
				else if (useSia) return SkynetUpload(req.file.path)
					.then((skylink) => req.file.randomId = skylink)
					.then(resolve).catch(reject);

				// Save to local storage
				else return fs.ensureDir(getDatedDirname())
					.then(() => tempFileName = getLocalFilename(req))
					.then(() => fs.copy(req.file.path, tempFileName, { preserveTimestamps: true }))
					.then(resolve).catch(reject);
			}))
		.then(() => log.debug('File saved', req.file.originalname, s3enabled ? 'in S3' : useSia ? 'on Sia blockchain' : 'on disk'))
		.catch((err) => next(err))

		// Delete the file
		.then(() => fs.remove(req.file.path))
		.then(() => log.debug('Temp file', 'deleted'))

		// Fix the file path
		.then(() => !s3enabled && (req.file.path = tempFileName)) // skipcq: JS-0090
		.then(() => next())
		.catch((err) => next(err));
}