1

I need to upload large files (2GB+) using Filepond to a NodeJS server running Express. These files need to be streamed (because of their size) to two locations...a local folder and a remote folder.

My research led me to a solution using tus-node-server https://github.com/pqina/filepond/issues/48

I've implemented the solution as seen below but I don't know how to:
1. Change the name of the file on upload (it uses a UID, I'd like to use the filename from the "metadata" property)
2. Execute a function on the server during or after the upload.

Any help?

Client.js

Filepond.setOptions({
    server: {
        process: (fieldName, file, metadata, load, error, progress, abort) => {
            var upload = new tus.Upload(file, {
                    endpoint: `/upload`,
                    retryDelays: [0, 1000, 3000, 5000],
                    metadata: {
                        filename: file.name,
                        filetype: file.type
                    },
                onError: function(err) {
                    console.log("Failed because: " + err);
                    error(err)
                },
                onProgress: function(bytesUploaded, bytesTotal) {
                    progress(true, bytesUploaded, bytesTotal)
                },
                onSuccess: function() {
                    load(upload.url.split('/').pop())
                }
            })

            // Start the upload
            upload.start();

            return {
                abort: () => {
                    upload.abort()
                    abort()
                }
            }
        }
    }
})

Server.js

const express = require('express');
const app = express();
const uploadApp = express();
const Client = require('ftp');
const path = require('path');
const tus = require('tus-node-server');

var tusServer = new tus.Server();

tusServer.datastore = new tus.FileStore({
    path: '/public/files'
});

uploadApp.all('*', tusServer.handle.bind(tusServer));

app.use('/public', express.static(path.join(__dirname, "/public")));
app.use('/upload', uploadApp);

app.listen(3000);

Before trying this method I was using app.post to receive the upload and perform further action.

app.post('/upload', (req, res, next) => {
    let uploadFile = req.files.file,
        fileName = req.files.file.name,
        ftp = new Client();

    uploadFile.mv(`${__dirname}/public/files/${fileName}`, err => {
        if (err) { return res.status(500).send(err) };
        res.json({ file: `public/${req.files.file.name}` })
    });

    ftp.on('ready', () => {
        ftp.put(fileName, `/ftppath/${fileName}`, err => {
            if (err) throw err;
            ftp.end();
        })
    })
    ftp.connect(ftpOptions)
});
dlg
  • 41
  • 3

0 Answers0