Загрузка чанка с помощью Filepond на NodeJS, на котором работает Express - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно загрузить большие файлы (2 ГБ +), используя Filepond на сервер NodeJS, на котором работает Express.Эти файлы должны быть переданы (из-за их размера) в два места: локальную папку и удаленную папку.

Мои исследования привели меня к решению, использующему tus-node-server https://github.com/pqina/filepond/issues/48

Я реализовал решение, как показано ниже, но я не знаю, как:
1. Изменить имя файла при загрузке (он использует UID, я хотел бы использовать имя файла из "метаданные "свойство)
2. Выполнить функцию на сервере во время или после загрузки.

Любая помощь?

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);

Прежде чем попробовать этот метод, я использовал app.post для получения загрузки и выполнения дальнейших действий.

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)
});
...