Создание каталога не работает, базовый ftp-модуль в узле Js

#node.js #ftp

#node.js #ftp

Вопрос:

Я пытаюсь загрузить файл на FTP-сервер, но я вижу несколько записей, но остальные пропущены, даже ошибка не генерируется. Я не знаю, где именно я получаю wrong.is это проблема синхронизации или проблема самого пакета? Я даже использовал пакет jsFtp, который также может помещать буфер на сервер, но работает не так, как ожидалось. ниже приведен мой код и выходные данные.

 const unzipper = require("unzipper");
const ftp = require("basic-ftp");

const client = new ftp.Client();
await client.access({...options});


const zip = fs.createReadStream(path.join(filePath, `code.zip`)).pipe(unzipper.Parse({ raw: true, forceStream: true}));

for await (const entry of zip) {
    await client.cd("/");
    const type = entry.type; // 'Directory' or 'File'
    const size = entry.vars.uncompressedSize; // There is also compressedSize;
    
    let fileArray = entry.path.split("/");

    if(size > 0 ) {
        let fileName = fileArray.pop();
        let dir = fileArray.splice(1).join("/");
        await client.uploadFrom(entry, dir   "/"   fileName);
    }

    if(type === 'Directory') {
        let dir = fileArray.splice(1).join("/");
        await client.ensureDir(`${dir}`);
        // await client.clearWorkingDir();
    }
}

console.log("Entry Read Finished");

  
 .gitignore                             
LICENSE                                
README.md                              
app/                                   
app/bootstrap.php                      
app/config.php                         
composer.json                          
console.php                            
src/                                   
src/SuperBlog/                         
src/SuperBlog/Command/                 
src/SuperBlog/Command/ArticleDetailComm
src/SuperBlog/Controller/              
src/SuperBlog/Controller/ArticleControl
src/SuperBlog/Controller/HomeController
src/SuperBlog/Model/                   
src/SuperBlog/Model/Article.php        
src/SuperBlog/Model/ArticleRepository.p
src/SuperBlog/Persistence/             
src/SuperBlog/Persistence/InMemoryArtic
src/SuperBlog/Views/                   
src/SuperBlog/Views/article.twig       
src/SuperBlog/Views/home.twig          
src/SuperBlog/Views/layout.twig        
web/                                   
web/.htaccess                          
web/index.php
  
 Creating Directory /
Uploading .gitignore
File:  '' '.gitignore'
Uploading LICENSE
File:  '' 'LICENSE'
Uploading README.md
File:  '' 'README.md'
Creating Directory /app/
Uploading bootstrap.php
File:  'app' 'bootstrap.php'
Uploading config.php
File:  'app' 'config.php'
Entry Read Finished
  

кто-нибудь может подсказать, что не так с кодом. Zip отлично работает, ошибок в этом нет.

Ответ №1:

Вы можете упростить это, используя поддержку uploadFromDir basic-ftp, которая автоматически создаст требуемую структуру папок и загрузит содержимое файла. Вот рабочий пример (успешно протестирован на общедоступном ftp-сервереhttps://dlptest.com/ftp-test /):

 const unzipper = require("unzipper");
const ftp = require("basic-ftp");
const fs = require('fs');
const path = require('path');

(async () => {
    try {
        await fs.createReadStream(path.resolve('./testzip.zip'))
            .pipe(unzipper.Extract({path: './tmp-extract'}))
            .promise();

        const client = new ftp.Client();
        await client.access({
            host: "<host>",
            user: "<user>",
            password: "<password>",
        });

        await client.uploadFromDir("./tmp-extract");
        console.log("upload successful");
    } catch (err) {
        console.log(err);
    }

})();
  

Комментарии:

1. Я на самом деле не хочу извлекать zip. если у меня нет другого решения, тогда нужно подумать об этом методе. хотя спасибо за ваше предложение.

2. Могу я спросить, почему? Вы всегда можете удалить временный файл после загрузки по ftp. Если вы обеспокоены дополнительной записью / чтением файловой системы, то это, конечно, не лучшее решение. Но, учитывая простоту этого, я бы просто пошел с этим 🙂

3. ДА. Поскольку обычно при архивировании существует дополнительный каталог, и в моем случае для определения имени каталога будет задействован вызов API, даже если этот каталог не будет находиться на FTP-сервере. По этой причине я хочу, чтобы данные передавались напрямую, и если бы я мог управлять этим, в большом файле я мог бы избавиться от накладных расходов на чтение-запись в системе.

4. Я понимаю, давайте посмотрим, может быть, кто-то еще знает способ сделать это. Я оставлю ответ, хотя 🙂