67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | var fs = require('fs') | ||
|  | var os = require('os') | ||
|  | var path = require('path') | ||
|  | var crypto = require('crypto') | ||
|  | var mkdirp = require('mkdirp') | ||
|  | 
 | ||
|  | function getFilename (req, file, cb) { | ||
|  |   crypto.randomBytes(16, function (err, raw) { | ||
|  |     cb(err, err ? undefined : raw.toString('hex')) | ||
|  |   }) | ||
|  | } | ||
|  | 
 | ||
|  | function getDestination (req, file, cb) { | ||
|  |   cb(null, os.tmpdir()) | ||
|  | } | ||
|  | 
 | ||
|  | function DiskStorage (opts) { | ||
|  |   this.getFilename = (opts.filename || getFilename) | ||
|  | 
 | ||
|  |   if (typeof opts.destination === 'string') { | ||
|  |     mkdirp.sync(opts.destination) | ||
|  |     this.getDestination = function ($0, $1, cb) { cb(null, opts.destination) } | ||
|  |   } else { | ||
|  |     this.getDestination = (opts.destination || getDestination) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | DiskStorage.prototype._handleFile = function _handleFile (req, file, cb) { | ||
|  |   var that = this | ||
|  | 
 | ||
|  |   that.getDestination(req, file, function (err, destination) { | ||
|  |     if (err) return cb(err) | ||
|  | 
 | ||
|  |     that.getFilename(req, file, function (err, filename) { | ||
|  |       if (err) return cb(err) | ||
|  | 
 | ||
|  |       var finalPath = path.join(destination, filename) | ||
|  |       var outStream = fs.createWriteStream(finalPath) | ||
|  | 
 | ||
|  |       file.stream.pipe(outStream) | ||
|  |       outStream.on('error', cb) | ||
|  |       outStream.on('finish', function () { | ||
|  |         cb(null, { | ||
|  |           destination: destination, | ||
|  |           filename: filename, | ||
|  |           path: finalPath, | ||
|  |           size: outStream.bytesWritten | ||
|  |         }) | ||
|  |       }) | ||
|  |     }) | ||
|  |   }) | ||
|  | } | ||
|  | 
 | ||
|  | DiskStorage.prototype._removeFile = function _removeFile (req, file, cb) { | ||
|  |   var path = file.path | ||
|  | 
 | ||
|  |   delete file.destination | ||
|  |   delete file.filename | ||
|  |   delete file.path | ||
|  | 
 | ||
|  |   fs.unlink(path, cb) | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = function (opts) { | ||
|  |   return new DiskStorage(opts) | ||
|  | } |