#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. Я понимаю, давайте посмотрим, может быть, кто-то еще знает способ сделать это. Я оставлю ответ, хотя 🙂