From 74aba1e5842f16fa7fb9e35f8041369cee1c058f Mon Sep 17 00:00:00 2001 From: Karl STEIN Date: Sun, 17 Apr 2016 19:31:29 -1000 Subject: [PATCH] Changes package version to 0.5.4 Updates README Renames method arguments avoiding reserved words (from) Handles errors on file reading to avoid server crashing Handles cases where GET file request has no headers --- README.md | 39 +++++++++++++++++++++++++++++---------- package.js | 2 +- ufs-server.js | 6 +++++- ufs-store.js | 36 ++++++++++++++++++++++-------------- 4 files changed, 57 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 0332590..713c96a 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ PhotosStore = new UploadFS.store.Local({ ## Transforming files -If you need to modify the file before it is saved to the store, you have to use the **transform** option. +If you need to modify the file before it is saved to the store, you have to use the `transformRead` or `transformWrite` parameter. A common use is to resize/compress images to get lighter versions of the uploaded files. ```js @@ -131,14 +131,14 @@ PhotosStore = new UploadFS.store.Local({ name: 'photos', path: '/uploads/photos', // Transform file when reading - transformRead: function (from, to, fileId, file, request) { - from.pipe(to); // this returns the raw data + transformRead: function (readStream, writeStream, fileId, file, request) { + readStream.pipe(writeStream); // this returns the raw data } // Transform file when writing - transformWrite: function (from, to, fileId, file) { + transformWrite: function (readStream, writeStream, fileId, file) { var im = Npm.require('imagemagick-stream'); var resize = im().resize('800x600').quality(90); - from.pipe(resize).pipe(to); + readStream.pipe(resize).pipe(writeStream); } }); ``` @@ -158,10 +158,10 @@ PhotosStore = new UploadFS.store.Local({ new UploadFS.store.Local({ collection: Thumbnails, name: 'thumbnails', - transformWrite: function(from, to, fileId, file) { + transformWrite: function(readStream, writeStream, fileId, file) { var im = Npm.require('imagemagick-stream'); var resize = im().resize('128x128').quality(80); - from.pipe(resize).pipe(to); + readStream.pipe(resize).pipe(writeStream); } }) ] @@ -289,9 +289,28 @@ PhotosStore = new UploadFS.store.Local({ }); ``` -## Writing files +## Reading a file from a store -Sometimes you could need to write to the store directly on the server without any client involved. +If you need to get a file directly from a store, do like below : + +```js +// Get the file from database +var file = Photos.findOne(fileId); + +// Get the file stream from the store +var readStream = PhotosStore.getReadStream(fileId, file); + +readStream.on('error', Meteor.bindEnvironment(function (error) { + console.error(err); +})); +readStream.on('data', Meteor.bindEnvironment(function (data) { + // handle the data +})); +``` + +## Writing a file to a store + +If you need to save a file directly to a store, do like below : ```js // Insert the file in database @@ -395,7 +414,7 @@ Template.upload.events({ }); ``` -### Uploading from a URL +### Uploading from an URL If you want to upload a file directly from a URL, use the `importFromURL(url, fileAttr, storeName, callback)` method. This method is available both on the client and the server. diff --git a/package.js b/package.js index 949c3ed..651f43e 100644 --- a/package.js +++ b/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'jalik:ufs', - version: '0.5.3', + version: '0.5.4', author: 'karl.stein.pro@gmail.com', summary: 'Base package for UploadFS', homepage: 'https://github.com/jalik/jalik-ufs', diff --git a/ufs-server.js b/ufs-server.js index e65a168..85be031 100644 --- a/ufs-server.js +++ b/ufs-server.js @@ -108,12 +108,16 @@ WebApp.connectHandlers.use(function (req, res, next) { ws.emit('end'); }); - var accept = req.headers['accept-encoding'] || ''; + var accept = ''; var headers = { 'Content-Type': file.type, 'Content-Length': file.size }; + if (typeof req.headers === 'object') { + accept = req.headers['accept-encoding']; + } + // Transform stream store.transformRead(rs, ws, fileId, file, req, headers); diff --git a/ufs-store.js b/ufs-store.js index 60b2341..140db96 100644 --- a/ufs-store.js +++ b/ufs-store.js @@ -146,6 +146,11 @@ UploadFS.Store = function (options) { // Get original stream var rs = self.getReadStream(fileId, file); + // Catch errors to avoid app crashing + rs.on('error', Meteor.bindEnvironment(function (error) { + callback.call(self, error, null); + })); + // Copy file data store.write(rs, copyId, Meteor.bindEnvironment(function (err) { if (err) { @@ -160,33 +165,33 @@ UploadFS.Store = function (options) { /** * Transforms the file on reading - * @param from - * @param to + * @param readStream + * @param writeStream * @param fileId * @param file * @param request * @param headers */ - self.transformRead = function (from, to, fileId, file, request, headers) { + self.transformRead = function (readStream, writeStream, fileId, file, request, headers) { if (typeof transformRead === 'function') { - transformRead.call(self, from, to, fileId, file, request, headers); + transformRead.call(self, readStream, writeStream, fileId, file, request, headers); } else { - from.pipe(to); + readStream.pipe(writeStream); } }; /** * Transforms the file on writing - * @param from - * @param to + * @param readStream + * @param writeStream * @param fileId * @param file */ - self.transformWrite = function (from, to, fileId, file) { + self.transformWrite = function (readStream, writeStream, fileId, file) { if (typeof transformWrite === 'function') { - transformWrite.call(self, from, to, fileId, file); + transformWrite.call(self, readStream, writeStream, fileId, file); } else { - from.pipe(to); + readStream.pipe(writeStream); } }; @@ -209,12 +214,15 @@ UploadFS.Store = function (options) { ws.on('error', errorHandler); ws.on('finish', Meteor.bindEnvironment(function () { var size = 0; - var from = self.getReadStream(fileId, file); + var readStream = self.getReadStream(fileId, file); - from.on('data', function (data) { + readStream.on('error', Meteor.bindEnvironment(function (error) { + callback.call(self, error, null); + })); + readStream.on('data', Meteor.bindEnvironment(function (data) { size += data.length; - }); - from.on('end', Meteor.bindEnvironment(function () { + })); + readStream.on('end', Meteor.bindEnvironment(function () { // Set file attribute file.complete = true; file.progress = 1;