FTP через HTTP с использованием функции Microsoft Azure - PullRequest
0 голосов
/ 13 марта 2020

Мне нужно настроить FTP через HTTP с помощью функции Microsoft Azure, но при попытке подключиться к FTP-серверу время ожидания клиента и выдается ошибка «ERR_GENERIC_CLIENT» и выход. Уверен, проблема в конфигах FTP-клиента, но я не могу найти, что изменить. azure функция:

let Client = require('ssh2-sftp-client');
let client = new Client();
module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    const boundary = req.headers['content-type'].split('=')[1];
    const splitedBody = req.body.toString().split(boundary);
    let parsedBody = {};
    let errors = [];
    splitedBody.forEach(field => {
        if (field.includes('name=')) {
            if (!field.includes('filename')) {
                let regex = /name="(.*?)"\r\n\r\n(.*)/g;
                let m = regex.exec(field);
                parsedBody[m[1]] = m[2];
            }
            else {
                let regex = /Content-Type:\s(.*?)\s\s(((.*)\s)*)--/;
                let m = regex.exec(field);
                let file = field.split(m[1])[1]
                file = file.substring(4, file.length - 4);
                fileBuffer = Buffer.from(file);
                let fileNameRegex = /filename="(.*?)"/g;
                let fileName = fileNameRegex.exec(field)[1];
                parsedBody.file = file;
                parsedBody.buffer = fileBuffer;
                parsedBody.fileName = fileName;
            }
        }
    });
    const config = {
        host: parsedBody.host,
        port: parseInt(parsedBody.port),
        username: parsedBody.user,
        password: parsedBody.password,
        tryKeyboard: true,
        readyTimeout: 5000
    };
    try {
        await client.connect(config);
        try {
            let result = await client.put(
                parsedBody.buffer,
                parsedBody.path,
                {
                    flags: 'w',  // w - write and a - append
                    encoding: null, // use null for binary files
                    mode: 0o666, // mode to use for created file (rwx)
                    autoClose: true // automatically close the write stream when finished
                })
        }
        catch (e) {
            errors.push({e, msg: 'put'});
            context.log(`main error: ${e.message}`);
        }
    }
    catch (e) {
        errors.push({e, msg: 'connect'});
        context.log(e);
    }
    finally {
        client.end();
    }
    context.res = {
        body: {
            config,
            errors
        }
    };
};

Для тестирования я использую небольшой манекен HTML форма

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ftp over http</title>
</head>
<body>
                <form action="azure function URL" enctype="multipart/form-data" method="post">
                    <input type="hidden" name="host" value="ftp.server.address">
                    <input type="hidden" name="port" value="21">
                    <input type="hidden" name="path" value="/test/">
                    <input type="hidden" name="user" value="username">
                    <input type="hidden" name="password" value="password">
            <div>
                Text field title: <input type="text" name="title" /></div>
            <div>
                File: <input type="file" name="file" /></div>
            <input type="submit" value="Upload" />
        </form>
</body>
</html>```
When I submit the form all I receive is the unhelpfull and undocumented "ERR_GENERIC_CLIENT" code.

1 Ответ

0 голосов
/ 17 марта 2020

Согласно предоставленному вами коду, вы используете SDK ssh2-sftp-client для подключения к FTP-серверу. Это неверно. мы просто можем использовать его для подключения к серверу sftp. если вы хотите подключиться к серверу ftp, я предлагаю вам использовать sdk basic-ftp. о том, как использовать SDK, см. https://github.com/patrickjuchli/basic-ftp.

Например

  1. Код
const ftp = require("basic-ftp")
const client = new ftp.Client()
module.exports = async function (context, req) {
module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    const boundary = req.headers['content-type'].split('=')[1];
    const splitedBody = req.body.toString().split(boundary);
    let parsedBody = {};
    let errors = [];
    splitedBody.forEach(field => {
        if (field.includes('name=')) {
            if (!field.includes('filename')) {
                let regex = /name="(.*?)"\r\n\r\n(.*)/g;
                let m = regex.exec(field);
                parsedBody[m[1]] = m[2];
            }
            else {
                let regex = /Content-Type:\s(.*?)\s\s(((.*)\s)*)--/;
                let m = regex.exec(field);
                let file = field.split(m[1])[1]
                file = file.substring(4, file.length - 4);
                fileBuffer = Buffer.from(file);
                let fileNameRegex = /filename="(.*?)"/g;
                let fileName = fileNameRegex.exec(field)[1];
                parsedBody.file = file;
                parsedBody.buffer = fileBuffer;
                parsedBody.fileName = fileName;
            }
        }
    });



client.ftp.verbose = true
    try {
        await   client.access({
            host: parsedBody.host,
        port: parseInt(parsedBody.port),
        user: parsedBody.user,
        password: parsedBody.password

        })
        var stream =getStream(parsedBody.buffer)
        const result =await client.upload(stream,parsedBody.path)
        context.log(result)

    }
    catch(err) {
        context.log(err)
        errors += err
    }
    client.close()

    context.res = {
        body: {
            errors
        }
    };











 };
Тест (я использую почтальона для теста)

enter image description here

enter image description here

Подключитесь к FTP-серверу, чтобы проверить его (я использую FileZilla )

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...