создание личной страницы (Серия из 7 частей)
В прошлой статье я писал о том, как опубликовать веб-сайт с помощью travis и FTP. Сначала все казалось прекрасным, но ночная сборка внезапно провалилась. Прошло много времени, пока я не понял, что это не из-за моего кода или моего ftp-сервера но из-за того, как Трэвис настроил свои сетевые уровни. Читайте здесь, если вам интересно: Читайте здесь, если вам интересно:
Но борьба еще не проиграна! Мой пакет веб-пространства включает экземпляр PHP, и поэтому я могу написать небольшой инструмент для загрузки HTTP. Я думаю, что это немного великовато, но это позволяет мне продолжать использовать мой пакет веб-пространства.
Как мне не стыдно, прошло много времени с тех пор, как я программировал PHP. Поэтому я предполагаю, что следующий код написан очень быстро и грязно.
Сначала мне нужен метод для чтения HTTP Заголовок для проверки секрета, который я отправляю вместе с запросом.
// code/upload.php#L3-L19
function getRequestHeaders() {
$headers = array();
foreach($_SERVER as $key => $value) {
if (substr($key, 0, 5) <> 'HTTP_') {
continue;
}
$header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$header] = $value;
}
return $headers;
}
$headers = getRequestHeaders();
if ($headers['Secret'] !== "") {
die("wrong secret");
}
Доступ к файлу можно получить с помощью $_FILES . Чтобы сохранить изображение где-нибудь, используйте move_uploaded_file .
// code/upload.php#L21-L22 move_uploaded_file($_FILES['zip-file']['tmp_name'], './'.$_FILES['zip-file']['name']);
Это очень просто, но должно быть достаточно для приема файлов из любого места. Чтобы ускорить процесс загрузки, я переместил весь /расстояние каталог в ZIP-архив. Поэтому мне нужно распаковать его с помощью PHP:
// code/upload.php#L23-L30
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->extractTo('./');
$zip->close();
echo 'ok';
} else {
echo 'error duringunzip';
}
Для архивирования файлов я использую архиватор и для отправки запроса на загрузку запрос .
архиватор очень прост и требует всего нескольких строк кода:
// code/zip.js
var fs = require('fs');
var archiver = require('archiver');
var fileName = 'test.zip'
var fileOutput = fs.createWriteStream(fileName);
const archive = archiver('zip');
fileOutput.on('close', function () {
console.log(archive.pointer() + ' total bytes');
console.log('archiver has been finalized and the output file descriptor has closed.');
});
archive.pipe(fileOutput);
archive.directory('dist/', false);
archive.on('error', function(err){
throw err;
});
archive.finalize();
Отправка файла также очень проста и выполняется быстро:
// code/send.js
const request = require("request");
const fs = require("fs");
const path = require("path");
var options = {
url: 'https://biehler-josef.de/upload.php',
headers: {
secret: process.env.JB_UPLOAD_SECRET
}
}
var r = request.post(options, function optionalCallback (err, httpResponse, body) {
console.log('Server responded with:', body, err);
})
var form = r.form()
form.append('zip-file', fs.createReadStream(path.join(__dirname, "..", 'test.zip')))
Я заменил развертывание FTP конечной точкой загрузки HTTP. Тот /расстояние каталог архивируется и разархивируется с помощью php . Это было необходимо, потому что загрузка по FTP не очень хорошо работает с Трэвисом.
Поскольку я не являюсь носителем английского языка, очень вероятно, что вы обнаружите ошибку. В этом случае, не стесняйтесь создавать запрос на извлечение здесь: https://github.com/gabbersepp/dev.to-posts . Также, пожалуйста, откройте PR для всех других видов ошибок.
Не беспокойтесь о конфликтах слияния. Я решу их самостоятельно.
создание личной страницы (Серия из 7 частей)
Оригинал: “https://dev.to/gabbersepp/publishing-my-blog-using-http-upload-in-php-3aj7”