Загрузка файлов Meteor + React + ReactRouter
В настоящее время я занимаюсь разработкой приложения с использованием Meteor, ReactJS и React Router (для маршрутизации). У меня есть требование, когда пользователь должен иметь возможность загружать заархивированный веб-сайт, а приложение Meteor должно отображать этот веб-сайт как часть одной из его страниц.
Типичный zip-файл будет содержать образец, подобный приведенному ниже,
ZippedFolder
|-- css
| |-- bootstrap.css
| |-- bootstrap.min.css
| +-- style.css
|-- js
| |-- bootstrap.js
| |-- bootstrap.min.js
| +-- script.js
+- index.html
Я настроил CollectionFS для хранения zip-файла в файловой системе и, используя meteorhacks: npm и несколько пакетов npm, я могу распаковать этот файл в известное место.
HTMLContent = new FS.Collection("html_content", {
stores: [new FS.Store.FileSystem("html_content"]
});
HTMLContent.on('stored', Meteor.bindEnvironment(function (fileObj) {
let unzip = Meteor.npmRequire('unzip'),
fs = Meteor.npmRequire('fs'),
path = fs.realpathSync(process.cwd() + '/../../../cfs/files/html_content/'),
file = fs.realpathSync(path + '/' + fileObj.copies.html_content.key),
output = path + '/' + fileObj._id;
// TODO: Not the best ways to pick the paths. For demo only.
if (!fs.existsSync(output)) {
fs.mkdirSync(output);
}
fs.createReadStream(file).pipe(unzip.Extract({
path: output
}));
}));
На компоненте React я загружаю заархивированное HTML-содержимое, используя следующий фрагмент кода.
handleZIPUpload(event) {
FS.Utility.eachFile(event, function(file) {
HTMLContent.insert(file, function(err, fileObj) {
if (err) {
console.log(err);
} else {
console.log(fileObj);
}
});
});
},
render(){
return (
<input id="html_content" type="file" onChange={this.handleZIPUpload}/>
)
}
Загрузка и распаковка работает. Однако CollectionFS не обслуживает HTML или другое содержимое по разархивированному пути.
http://meteorhost/cfs/files/html_content/file_id/index.html
Я также попытался разархивировать html-контент в общую папку структуры папок метеора. Однако в метеорной документации говорится, что общая папка предназначена для статических ресурсов. Так как он поддерживает индекс активов в общей папке. Поэтому для обновления индекса требуется перезапуск сервера.
Есть ли другое место, где я мог бы разместить HTML-контент, который можно обслуживать как есть?
ОБНОВЛЕНИЕ Я решил эту проблему, настроив виртуальный каталог nginx и загрузив файлы в это место, чтобы nginx обслуживал содержимое HTML.