apurv
apurv

Reputation: 71

SailsJS action2 multiple file upload

I am trying to upload multiple files from sailsjs 1.2.4

Here is my action :

module.exports = {


  friendlyName: 'Post',


  description: 'Post something.',

  files: ['mediaFiles'],

  inputs: {
    text : {
      required: true,
      type: 'string',
    },
    
    mediaFiles : {
      description : "Media files",
      example: '===',
      required : false
    }
  },


  exits: {

  },


  fn: async function (inputs) {
       inputs.mediaFiles._files.forEach(file=>{
            console.log(file)
       })
  })
}
}

I am getting below result in as file object :

{ stream:
   PassThrough {
     _readableState:
      ReadableState {
        objectMode: false,
        highWaterMark: 16384,
        buffer: BufferList { head: [Object], tail: [Object], length: 2 },
        length: 43093,
        pipes: null,
        pipesCount: 0,
        flowing: null,
        ended: true,
        endEmitted: false,
        reading: false,
        sync: false,
        needReadable: false,
        emittedReadable: true,
        readableListening: false,
        resumeScheduled: false,
        emitClose: true,
        destroyed: false,
        defaultEncoding: 'utf8',
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: true,
     domain: null,
     _events:
      { prefinish: [Function: prefinish],
        drain: [Function],
        end: [Function],
        error: [Array] },
     _eventsCount: 4,
     _maxListeners: undefined,
     _writableState:
      WritableState {
        objectMode: false,
        highWaterMark: 16384,
        finalCalled: false,
        needDrain: false,
        ending: true,
        ended: true,
        finished: true,
        destroyed: false,
        decodeStrings: true,
        defaultEncoding: 'utf8',
        length: 0,
        writing: false,
        corked: 0,
        sync: false,
        bufferProcessing: false,
        onwrite: [Function: bound onwrite],
        writecb: null,
        writelen: 0,
        bufferedRequest: null,
        lastBufferedRequest: null,
        pendingcb: 0,
        prefinished: true,
        errorEmitted: false,
        emitClose: true,
        bufferedRequestCount: 0,
        corkedRequestsFree: [Object] },
     writable: false,
     allowHalfOpen: true,
     _transformState:
      { afterTransform: [Function: bound afterTransform],
        needTransform: false,
        transforming: false,
        writecb: null,
        writechunk: null,
        writeencoding: 'buffer' },
     headers:
      { 'content-disposition':
         'form-data; name="mediaFiles"; filename="bwDzrPkA_400x400.jpg"',
        'content-type': 'image/jpeg' },
     name: 'mediaFiles',
     filename: 'bwDzrPkA_400x400.jpg',
     byteOffset: 378,
     byteCount: 43093,
     field: 'mediaFiles' },
  status: 'bufferingOrWriting' }

My question is how can I write this file stream to some path like /public/media/xyz.png . I used to with sails normal file upload where I can use this.req.file("name").upload() .. but not in action 2 . I checked other answers but they are uploading to s3 not writing on same server .

Upvotes: 0

Views: 463

Answers (1)

Jorge Vargas
Jorge Vargas

Reputation: 301

You could use a dependency sails-hook-uploads, for that you are able to define the dirpath in your settings:

https://github.com/sailshq/sails-hook-uploads/blob/master/index.js#L31

module.exports.upload = {
  dirpath: '.tmp/public', // recommended .tmp/uploads
  adapter: require('skipper-disk'), // Default
}

I highly recommend not using the public folder because it's the compiled assets destination, so you'll probably lose these files.

As an alternative, you might use a controller to upload the file as showing below:

https://github.com/mikermcneil/ration/blob/master/api/controllers/things/upload-thing.js#L54

After that, send it to the user:

https://github.com/mikermcneil/ration/blob/master/api/controllers/things/download-photo.js#L50

Upvotes: 1

Related Questions