diff --git a/.github/workflows/master_cefire-webapp0001.yml b/.github/workflows/master_cefire-webapp0001.yml new file mode 100644 index 000000000..a4e44807f --- /dev/null +++ b/.github/workflows/master_cefire-webapp0001.yml @@ -0,0 +1,70 @@ +# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# More GitHub Actions for Azure: https://github.com/Azure/actions + +name: Build and deploy PHP app to Azure Web App - cefire-webapp0001 + +on: + push: + branches: + - master + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read #This is required for actions/checkout + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + + - name: Check if composer.json exists + id: check_files + uses: andstor/file-existence-action@v1 + with: + files: 'composer.json' + + - name: Run composer install if composer.json exists + if: steps.check_files.outputs.files_exists == 'true' + run: composer validate --no-check-publish && composer install --prefer-dist --no-progress + + + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v4 + with: + name: php-app + path: . + + deploy: + runs-on: ubuntu-latest + needs: build + permissions: + id-token: write #This is required for requesting the JWT + contents: read #This is required for actions/checkout + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: php-app + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_A3827D44356A4A7FA0ADB157B3B9C544 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_E4626EAF47E74041ACEC4737F46488CB }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_A9D64345FFE446A5AB3F1A897C9FF8B2 }} + + - name: 'Deploy to Azure Web App' + uses: azure/webapps-deploy@v3 + id: deploy-to-webapp + with: + app-name: 'cefire-webapp0001' + slot-name: 'Production' + package: . + \ No newline at end of file diff --git a/blob/master/storage.php b/blob/master/storage.php new file mode 100644 index 000000000..58d23151d --- /dev/null +++ b/blob/master/storage.php @@ -0,0 +1,79 @@ +deleteBlob($containerName, $blobToDelete); + echo "

Archivo $blobToDelete eliminado correctamente.

"; + } catch (ServiceException $e) { + echo "

Error al eliminar: " . $e->getMessage() . "

"; + } +} + +// Subida de archivo ZIP +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['zipfile'])) { + $uploadedFile = $_FILES['zipfile']; + + if ($uploadedFile['type'] !== 'application/zip') { + echo "

Solo se permiten archivos ZIP.

"; + } else { + $blobName = basename($uploadedFile['name']); + $content = fopen($uploadedFile['tmp_name'], "r"); + + try { + $blobClient->createBlockBlob($containerName, $blobName, $content); + echo "

Archivo $blobName subido correctamente.

"; + } catch (ServiceException $e) { + echo "

Error al subir: " . $e->getMessage() . "

"; + } + } +} + +// Listar archivos +try { + $listOptions = new ListBlobsOptions(); + $blobs = $blobClient->listBlobs($containerName, $listOptions); +} catch (ServiceException $e) { + die("Error al listar archivos: " . $e->getMessage()); +} +?> + + + + + Gestor de archivos ZIP en Azure Blob + + +

Archivos ZIP en el contenedor

+ + + +

Subir nuevo archivo ZIP

+
+ + +
+ + diff --git a/composer.json b/composer.json new file mode 100644 index 000000000..ffd6551e1 --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "microsoft/azure-storage-blob": "^1.5" + } +} diff --git a/conexion.php b/conexion.php new file mode 100644 index 000000000..c91e60d77 --- /dev/null +++ b/conexion.php @@ -0,0 +1,39 @@ + PDO::ERRMODE_EXCEPTION, +// Fetch como array asociativo +PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, +// Desactivar emulación de prepares +PDO::ATTR_EMULATE_PREPARES => false, +// Asegurar la conexión TLS hacia Azure Database for MySQL +PDO::MYSQL_ATTR_SSL_CA => +'/etc/ssl/certs/BaltimoreCyberTrustRoot.crt.pem', +// Desactivamos la validación del certificado SSL +PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false, +]; +// Crear la conexión PDO +$pdo = new PDO($dsn, $dbUser, $dbPass, $options); +// Ejemplo: consulta sencilla +$stmt = $pdo->query('SELECT NOW() AS fecha_actual;'); +$fila = $stmt->fetch(); +echo "Conectado correctamente. Hora del servidor: " . +$fila['fecha_actual']; +} catch (PDOException $e) { +error_log('Error de conexión PDO: ' . $e->getMessage()); +echo "Error al conectar con la base de datos: " . +htmlspecialchars($e->getMessage()); +exit; +} diff --git a/descomprimir.php b/descomprimir.php new file mode 100644 index 000000000..4cc05fa41 --- /dev/null +++ b/descomprimir.php @@ -0,0 +1,53 @@ +setPrefix(""); // Sin prefijo específico +$blobs = $blobClient->listBlobs($sourceContainer, $options); + +foreach ($blobs->getBlobs() as $blob) { + if (strtolower(pathinfo($blob->getName(), PATHINFO_EXTENSION)) !== "zip") { + continue; + } + + echo "Procesando ZIP: " . $blob->getName() . PHP_EOL; + + // Descargar el ZIP + $zipContent = $blobClient->getBlob($sourceContainer, $blob->getName())->getContentStream(); + $tempZip = tempnam(sys_get_temp_dir(), 'zip'); + file_put_contents($tempZip, stream_get_contents($zipContent)); + + $zip = new ZipArchive(); + if ($zip->open($tempZip) === TRUE) { + for ($i = 0; $i < $zip->numFiles; $i++) { + $entry = $zip->getNameIndex($i); + $fileContent = $zip->getFromIndex($i); + if ($fileContent !== false) { + $uploadOptions = new CreateBlockBlobOptions(); + $blobClient->createBlockBlob($targetContainer, $entry, $fileContent, $uploadOptions); + echo "Extraído y subido: $entry" . PHP_EOL; + } + } + $zip->close(); + } else { + echo "Error abriendo el ZIP: " . $blob->getName() . PHP_EOL; + } + + unlink($tempZip); + break; // Solo procesamos el primer ZIP para este ejemplo +} + +?> diff --git a/index.php b/index.php index 82966e27a..d660e79e6 100644 --- a/index.php +++ b/index.php @@ -1,3 +1,3 @@ getBlob($containerName, $blobName); + $content = stream_get_contents($blob->getContentStream()); + + header('Content-Type: application/zip'); + header('Content-Disposition: attachment; filename="' . basename($blobName) . '"'); + header('Content-Length: ' . strlen($content)); + + echo $content; + exit; + } catch (Exception $e) { + http_response_code(500); + echo "Error al descargar el archivo: " . $e->getMessage(); + exit; + } +} + +// Eliminar archivo si se envió solicitud +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_blob'])) { + try { + $blobClient->deleteBlob($containerName, $_POST['delete_blob']); + echo "

Archivo eliminado: {$_POST['delete_blob']}

"; + } catch (Exception $e) { + echo "

Error al eliminar: {$e->getMessage()}

"; + } +} + +// Subir archivo nuevo +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['zipfile'])) { + $file = $_FILES['zipfile']; + if ($file['error'] === UPLOAD_ERR_OK && mime_content_type($file['tmp_name']) === 'application/zip') { + $blobName = basename($file['name']); + try { + $content = fopen($file['tmp_name'], 'r'); + $blobClient->createBlockBlob($containerName, $blobName, $content); + echo "

Archivo subido: {$blobName}

"; + } catch (Exception $e) { + echo "

Error al subir: {$e->getMessage()}

"; + } + } else { + echo "

Solo se permiten archivos .zip válidos.

"; + } +} + +// Listar blobs +try { + $blobList = $blobClient->listBlobs($containerName, new ListBlobsOptions()); + $blobs = $blobList->getBlobs(); +} catch (Exception $e) { + die("Error al listar blobs: " . $e->getMessage()); +} +?> + + + + + + Gestor de archivos ZIP en Azure Blob + + +

Archivos ZIP en ''

+ + + +

Subir nuevo archivo ZIP

+
+ + +
+ +