Devices Feature Erweiterung
* manueller Config Upload wurde integriert *
This commit is contained in:
@@ -135,6 +135,17 @@
|
||||
padding: 6px 0.85rem 6px 0.85rem !important;
|
||||
}
|
||||
|
||||
.fa-fileupload {
|
||||
font-size: 28px;
|
||||
color: #128a01;
|
||||
margin-top: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.form-label-upload {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<!-- start page title -->
|
||||
@@ -337,15 +348,20 @@ foreach ($devicesall as $deviceall) {
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
</div>
|
||||
<?php if ($me->is('Admin')) : ?>
|
||||
<div class="col-12 col-lg-3 card-border">
|
||||
<div class="overflow-auto">
|
||||
<h4 class="float-left">Config Backups</h4>
|
||||
|
||||
<?php if ($devices->devicetype->devicemanufactor->config_backup > count()): ?>
|
||||
<span><i title="Switch config" class="fa-light fa-rectangle-code code-ico"
|
||||
data-toggle="modal" data-target="#configCode"></i></span>
|
||||
<?php endif;
|
||||
?>
|
||||
|
||||
<?php
|
||||
if ($me->is('Admin')):
|
||||
?>
|
||||
<div class="float-right">
|
||||
@@ -354,8 +370,30 @@ foreach ($devicesall as $deviceall) {
|
||||
<button class="btn btn-primary "><span id="create-backup-button-text">Backup erstellen</span>
|
||||
<span id="create-backup-load"></i></span></button>
|
||||
</a></div>
|
||||
<span class="float-right mr-2"><i
|
||||
class="fa-solid fa-cloud-arrow-up fa-fileupload"></i></span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div id="documents-upload" class="row mt-2 mb-2 justify-content-start" style="display: none">
|
||||
<div class="col-5 col-lg-4 text-center"><label
|
||||
class="form-label form-label-upload">Backup Upload</label></div>
|
||||
<div class="col-19 col-lg-8" id="attachments" data-newkey="">
|
||||
|
||||
<div class="input-group mb-2">
|
||||
<div class="custom-file">
|
||||
<input type="file" class="custom-file-input" id="files-input"
|
||||
name="files[]"
|
||||
multiple>
|
||||
<label class="custom-file-label" for="files-input"
|
||||
aria-describedby="">Datei(en)</label>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="attachment-div mb-2"></div>
|
||||
<div id="uploadsts"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
if ($devicesconfig->success == "true" && $devicesconfig->data > count()) {
|
||||
?>
|
||||
@@ -683,6 +721,64 @@ foreach ($devicesall as $deviceall) {
|
||||
|
||||
<script type="text/javascript">
|
||||
const customers =<?php echo json_encode($customer); ?>;
|
||||
|
||||
function uploadajax(totalFiles, currentIndex) {
|
||||
let fileList = $('#files-input').prop("files");
|
||||
let form_data = new FormData();
|
||||
|
||||
form_data.append("files[]", fileList[currentIndex]);
|
||||
if ($('.fa-folder-open').data('id')) {
|
||||
form_data.append("folder_id", $('.fa-folder-open').data('id'));
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: '<?= self::getUrl("Device", "api", ['do' => 'uploadFile', 'id' => $devices->id]) ?>',
|
||||
cache: false,
|
||||
contentType: false,
|
||||
processData: false,
|
||||
async: true,
|
||||
data: form_data,
|
||||
type: 'POST',
|
||||
xhr: function () {
|
||||
let xhr = $.ajaxSettings.xhr();
|
||||
if (xhr.upload) {
|
||||
xhr.upload.addEventListener('progress', function (event) {
|
||||
let percent = 0;
|
||||
if (event.lengthComputable) {
|
||||
percent = Math.ceil(event.loaded / event.total * 100);
|
||||
}
|
||||
$('.pb-' + currentIndex).css('width', percent + '%')
|
||||
.attr('aria-valuenow', percent);
|
||||
}, false);
|
||||
}
|
||||
return xhr;
|
||||
},
|
||||
success: function (res, status) {
|
||||
$('.pb-' + currentIndex).closest('.progress').remove();
|
||||
if (currentIndex < totalFiles - 1) {
|
||||
uploadajax(totalFiles, currentIndex + 1);
|
||||
} else {
|
||||
window.location.reload();
|
||||
}
|
||||
},
|
||||
error: function (res) {
|
||||
alert('Upload fehlgeschlagen.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function formatFileSize(bytes) {
|
||||
if (bytes >= 1024 * 1024) {
|
||||
const megabytes = bytes / (1024 * 1024);
|
||||
return megabytes.toFixed(2) + ' MB';
|
||||
} else if (bytes >= 1024) {
|
||||
const kilobytes = bytes / 1024;
|
||||
return kilobytes.toFixed(2) + ' KB';
|
||||
} else {
|
||||
return Math.round(bytes) + ' Bytes'; // Keine Nachkommastellen
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
|
||||
@@ -1304,6 +1400,34 @@ foreach ($devicesall as $deviceall) {
|
||||
;
|
||||
});
|
||||
$('[data-toggle="tooltip"]').tooltip()
|
||||
|
||||
$(document).on('change', '#files-input', function () {
|
||||
let fileList = $('#files-input').prop("files");
|
||||
// Leeren des Upload-Status-Containers
|
||||
$('#uploadsts').html('');
|
||||
$('.attachment-div').html('');
|
||||
|
||||
// Erzeuge für jede Datei einen eigenen Fortschrittsbalken (eindeutig per Index)
|
||||
for (let i = 0; i < fileList.length; i++) {
|
||||
$('.attachment-div').append(`
|
||||
<div class="progress" style="margin-bottom: 10px;">
|
||||
<div class="progress-bar progress-bar-striped progress-bar-animated pb-${i}"
|
||||
role="progressbar"
|
||||
style="width: 0%;"
|
||||
aria-valuenow="0"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100"></div>
|
||||
</div>
|
||||
`);
|
||||
}
|
||||
|
||||
if (fileList.length > 0) {
|
||||
uploadajax(fileList.length, 0);
|
||||
}
|
||||
});
|
||||
$(document).on('click', '.fa-fileupload', function () {
|
||||
$('#documents-upload').toggle();
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
@@ -318,6 +318,9 @@ class DeviceController extends mfBaseController
|
||||
case "createconfig":
|
||||
$this->createConfig($ip);
|
||||
break;
|
||||
case "uploadFile":
|
||||
$this->uploadFile($id);
|
||||
break;
|
||||
case "getoltinfo":
|
||||
$this->getoltInfo($ip, $portid, $adv);
|
||||
break;
|
||||
@@ -361,6 +364,15 @@ class DeviceController extends mfBaseController
|
||||
|
||||
exit;
|
||||
}
|
||||
private function uploadFile($id)
|
||||
{
|
||||
$r = $this->request;
|
||||
$file = $_FILES;
|
||||
$response = DeviceModel::uploadFile($id, $file);
|
||||
echo $response;
|
||||
die();
|
||||
|
||||
}
|
||||
|
||||
private function createConfig($ip)
|
||||
{
|
||||
|
||||
@@ -362,4 +362,65 @@ class DeviceModel
|
||||
endif;
|
||||
return json_decode($response);
|
||||
}
|
||||
public static function uploadFile($id, $file)
|
||||
{
|
||||
$response = "";
|
||||
|
||||
if (TT_MBI_API_ENABLE) {
|
||||
// Überprüfe, ob im $_FILES-Array ein 'files'-Eintrag vorhanden ist
|
||||
// und ob mindestens eine Datei hochgeladen wurde.
|
||||
if (!isset($_FILES['files']) || !isset($_FILES['files']['tmp_name'][0]) || empty($_FILES['files']['tmp_name'][0])) {
|
||||
return json_encode(["error" => "Dateiupload fehlgeschlagen: Keine Datei unter 'files' gefunden."]);
|
||||
}
|
||||
|
||||
// Baue die URL zusammen
|
||||
$url = TT_MBI_API_URL . TT_MBI_API_VERSION . '/deviceuploadfile/' . $id;
|
||||
|
||||
// Erstelle ein CURLFile-Objekt aus dem ersten (und evtl. einzigen) Element
|
||||
$curlFile = new CURLFile(
|
||||
$_FILES['files']['tmp_name'][0],
|
||||
$_FILES['files']['type'][0],
|
||||
$_FILES['files']['name'][0]
|
||||
);
|
||||
|
||||
// Bereite die POST-Daten vor: Der Schlüssel "file" entspricht
|
||||
// eventuell den Erwartungen der API.
|
||||
$postFields = ['file' => $curlFile];
|
||||
|
||||
// cURL-Handle initialisieren und Optionen setzen
|
||||
$curl = curl_init();
|
||||
curl_setopt_array($curl, [
|
||||
CURLOPT_URL => $url,
|
||||
CURLOPT_HEADER => true,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_SSL_VERIFYHOST => false,
|
||||
CURLOPT_SSL_VERIFYPEER => false,
|
||||
CURLOPT_TIMEOUT => 0,
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_POSTFIELDS => $postFields,
|
||||
CURLOPT_HTTPHEADER => [
|
||||
'Authorization: Bearer ' . TT_MBI_API_KEY
|
||||
]
|
||||
]);
|
||||
|
||||
// Führe die Anfrage aus
|
||||
$response = curl_exec($curl);
|
||||
|
||||
// Fehlerbehandlung: Bei einem cURL-Fehler gebe diesen als JSON zurück
|
||||
if (curl_errno($curl)) {
|
||||
$error_msg = curl_error($curl);
|
||||
curl_close($curl);
|
||||
return json_encode(["error" => $error_msg]);
|
||||
}
|
||||
|
||||
// Schließe den cURL-Handle
|
||||
curl_close($curl);
|
||||
}
|
||||
|
||||
// Dekodiere die Antwort und gebe sie zurück
|
||||
return json_decode($response);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user