You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					67 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					67 lines
				
				1.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								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)
							 | 
						||
| 
								 | 
							
								}
							 |