How to use Node tmp Package to write a file from the buffer
Asked Answered
G

1

14

I need to write a file temporarily to the file system in order to run a quick check on it, and I then want it deleted.

Based on my Googling, it looks like the tmp package for NodeJS can be used: https://www.npmjs.com/package/tmp

But I'm really confused by the documentation.

This is the example they give on how to use it to create a temporary file:

var tmp = require('tmp');

tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback) {
  if (err) throw err;

  console.log("File: ", path);
  console.log("Filedescriptor: ", fd);

  // If we don't need the file anymore we could manually call the cleanupCallback 
  // But that is not necessary if we didn't pass the keep option because the library 
  // will clean after itself. 
  cleanupCallback();
});

But when I read that, it looks like its passing a function into tmp.file. How do I pass a buffer, a path, or something into this for its to do its thing and create the temporary file?

I must be missing something silly.

Thank-you for your help!

------------- Final Answer -------------------------------------------------

Figured I'd post my final answer in case it helped someone else who somehow had a brain block when reading the example code. This should have been obvious now that I see the problem. Thank-you CViejo.:

var fs = require('fs');
var Q = require('q');
var tmp = require('tmp');

self=this;

/**
 * writeBufferToFile - Takes a buffer and writes its entire contents to the File Descriptor location
 * @param fd - File Decripter
 * @param buffer - Buffer
 * @returns {*|promise} - true if successful, or err if errors out.
 */
module.exports.writeBufferToFile = function(fd, buffer){
    var deferred = Q.defer();
    fs.write(fd, buffer, 0, buffer.length, 0, function (err, written, buffer){
                                                if(!written)
                                                    deferred.reject(err);
                                                else
                                                    deferred.resolve(true);
                                            });

    return deferred.promise;
}

/**
 * writeBufferToTempFile - Takes a buffer and writes the entire contents to a temp file
 * @param buffer - The buffer to write out.
 * @returns {*|promise} - The file path of the file if a success, or the error if a failure.
 */
module.exports.writeBufferToTempFile = function(buffer){
    var deferred = Q.defer();

    tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback) {
        if (err)
            deferred.reject(err);
        else {
            self.writeBufferToFile(fd, buffer).then(
                function (isWritten) {      deferred.fulfill(path);     },
                function (err) {            deferred.reject(err);       });
        }
    });
    return deferred.promise;
}
Gris answered 9/11, 2015 at 22:46 Comment(0)
O
21

In short, you don't. The point of this module is precisely to guess the system's default temporary directory, generate random file names and handle the file and directory removal for you.

In that sense it's quite opinionated about where to save and using a specific file name, you can only specify a folder name within the system's temporary directory and prefix / postfix options.

About writing contents to the file, you have to handle it yourself:

var fs  = require("fs");
var tmp = require("tmp");

tmp.file(function (err, path, fd, cleanup) {
    if (err) throw err;

    fs.appendFile(path, new Buffer("random buffer"), function (err) {
      if (err)
        throw err
    });
    // fs.appendFile(path, "random text");
});

Other modules like temp or temporary work in similar manner.

Olindaolinde answered 12/11, 2015 at 16:41 Comment(2)
Cviejo, thank-you. I was thinking about this completely wrong. Can't believe I didn't see that earlier. I actually just noticed it about an hour ago and just got the code working. Somehow I was stuck on the fact I needed to pass something in, when in reality I just needed to work with what I was given.Gris
Exactly. Tbh, it also took me a bit to digest that for most cases you really don't need your own folder..Olindaolinde

© 2022 - 2024 — McMap. All rights reserved.