data-man-filepath.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. var mime = Npm.require('mime');
  2. var fs = Npm.require("fs");
  3. /**
  4. * @method DataMan.FilePath
  5. * @public
  6. * @constructor
  7. * @param {String} filepath
  8. * @param {String} [type] The data content (MIME) type. Will lookup from file if not passed.
  9. */
  10. DataMan.FilePath = function DataManFilePath(filepath, type) {
  11. var self = this;
  12. self.filepath = filepath;
  13. self._type = type || mime.lookup(filepath);
  14. };
  15. /**
  16. * @method DataMan.FilePath.prototype.getBuffer
  17. * @private
  18. * @param {function} callback callback(err, buffer)
  19. * @returns {Buffer|undefined}
  20. *
  21. * Passes a Buffer representing the data to a callback.
  22. */
  23. DataMan.FilePath.prototype.getBuffer = function dataManFilePathGetBuffer(callback) {
  24. var self = this;
  25. // Call node readFile
  26. fs.readFile(self.filepath, Meteor.bindEnvironment(function(err, buffer) {
  27. callback(err, buffer);
  28. }, function(err) {
  29. callback(err);
  30. }));
  31. };
  32. /**
  33. * @method DataMan.FilePath.prototype.getDataUri
  34. * @private
  35. * @param {function} callback callback(err, dataUri)
  36. *
  37. * Passes a data URI representing the data to a callback.
  38. */
  39. DataMan.FilePath.prototype.getDataUri = function dataManFilePathGetDataUri(callback) {
  40. var self = this;
  41. self.getBuffer(function (error, buffer) {
  42. if (error) {
  43. callback(error);
  44. } else {
  45. if (!self._type) {
  46. callback(new Error("DataMan.getDataUri couldn't get a contentType"));
  47. } else {
  48. var dataUri = "data:" + self._type + ";base64," + buffer.toString("base64");
  49. buffer = null;
  50. callback(null, dataUri);
  51. }
  52. }
  53. });
  54. };
  55. /**
  56. * @method DataMan.FilePath.prototype.createReadStream
  57. * @private
  58. *
  59. * Returns a read stream for the data.
  60. */
  61. DataMan.FilePath.prototype.createReadStream = function dataManFilePathCreateReadStream() {
  62. // Stream from filesystem
  63. return fs.createReadStream(this.filepath);
  64. };
  65. /**
  66. * @method DataMan.FilePath.prototype.size
  67. * @param {function} callback callback(err, size)
  68. * @private
  69. *
  70. * Passes the size in bytes of the data to a callback.
  71. */
  72. DataMan.FilePath.prototype.size = function dataManFilePathSize(callback) {
  73. var self = this;
  74. if (typeof self._size === "number") {
  75. callback(null, self._size);
  76. return;
  77. }
  78. // We can get the size without buffering
  79. fs.stat(self.filepath, Meteor.bindEnvironment(function (error, stats) {
  80. if (stats && typeof stats.size === "number") {
  81. self._size = stats.size;
  82. callback(null, self._size);
  83. } else {
  84. callback(error);
  85. }
  86. }, function (error) {
  87. callback(error);
  88. }));
  89. };
  90. /**
  91. * @method DataMan.FilePath.prototype.type
  92. * @private
  93. *
  94. * Returns the type of the data.
  95. */
  96. DataMan.FilePath.prototype.type = function dataManFilePathType() {
  97. return this._type;
  98. };