/*jshint laxcomma: true, smarttabs: true, node: true*/ 'use strict'; /** * A field type for dealing with incoming file streams. * Will write the file to a location and store its path * @module tastypie/fields/file * @author Eric Satterwhite * @since 0.5.0 * requires os * requires fs * requires path * requires url-join * requires boom * requires mkdirp * @requires tastypie/lib/class * @requires tastypie/lib/fields/api */ var os = require( 'os' ) , fs = require( 'fs' ) , path = require( 'path' ) , urljoin = require( 'url-join' ) , boom = require( 'boom' ) , mkdirp = require( 'mkdirp' ) , Class = require( '../class' ) , ApiField = require( './api' ) , FileField ; /** * @constructor * @alias module:tastypie/fields/file * @extends module:tastypie/fields/api * @param {Object} options * @param {Boolean} [options.stream=false] * @param {String} [options.root=os.tempDir()] * @param {String} [options.dir] * @param {Boolean} [options.create=false] Auto create the resolved directory */ FileField = new Class({ inherits: ApiField , options:{ root: os.tmpDir(), dir: 'uploads', create: false } ,constructor: function( options ){ this.parent('constructor', options ); try { this.options.create && mkdirp.sync( path.join( this.options.root, this.options.dir ) ); } catch( e ){ if( e.code && e.code !== 'EEXIST' ){ this.emit('error', boom.wrap( e ) ); } // pass. don't care; } } , convert: function( value ){ return urljoin( this.options.dir, path.basename( value ) ); } , hydrate: function( bundle, cb ){ var fpath // file path to write , out // output write stream ; this.parent('hydrate', bundle, ( err, value ) => { fpath = path.join( this.options.root, this.options.dir, value.hapi.filename ); out = fs.createWriteStream( fpath ); value.once('error', cb ); value.once('end', cb.bind( null, null, fpath ) ); value.pipe( out ); }); } }); module.exports = FileField;