Cargando...

Cortar y unir archivos desde PHP

Aprende cómo escribir un algoritmo para cortar un archivo en 1 o más partes, sin que este se corrompa, de tal manera que el mismo algoritmo sea útil para unir las partes y tu archivo final siga funcional. Es por ello, que también te dejo un vídeo donde explico cómo desarrollarlo e implementarlo.


Introducción

Existen ficheros o archivos que los procesadores y gestores de datos, debido a su gran longitud y limitación de recursos del equipo, es difícil procesarlos. De la misma manera en que existen grandes cantidades de datos alojados en un mismo fichero, también las hay en muchos pequeños ficheros que se pueden resumir en menos o bien, en un sólo fichero.

Problemática

Los ficheros son muy pesados para que un equipo con recursos limitados pueda procesarlo debidamente y este responda de una forma no tan atinada a la esperada y provoque algún desborde de memoria y por ende, caiga en combate.

Figure el siguiente escenario

Se necesita realizar pruebas a un formulario de acceso, como el habitual login de los sitios webs, aplicando un ataque de fuerza bruta con algún algoritmo escrito en el lenguaje de preferencia, donde este utilizará un diccionario para descubrir la contraseña de algún usuario o correo electrónico registrado en el sistema víctima. La metodología es la lógica, tomará alguna palabra y la irá probando haciendo el ataque al servidor.

En situaciones, estos ataques fracasan por las limitantes de recursos del ordenador. Lo que le acabo de comentar, solamente es un ejemplo del montón donde se pueden utilizar diccionarios, tomando a este como un fichero pesado, que podría ser dividido en varias partes, para luego ser analizados uno por uno y así lograr terminarlo. Además de cortarlos, si ha desechado el fichero original, podrá volverlo a unir o juntar en un sólo fichero.

Prerrequisitos

Para utilizar este proyecto deberá tener instalado el siguiente servicio y herramienta. Para no complicarse pueden instalar algún gestor de paquetes como WAMP(Windows), LAMPP (Linux) o XAMPP (Todas las plataformas).

1- Apache 2		|		NGinx
2- PHP 4.3.0 		| >  superiores
3- Git			| Descargar el paquete del proyecto.
Instalación

En caso de GNU / Linux.

git clone https://github.com/SideMasterGM/Split-Files.git /var/www/html/Split-Files

En caso de Windows, con XAMPP.

git clone https://github.com/SideMasterGM/Split-Files.git C:/xampp/htdocs/Split-Files
Modo de Uso

No existen formularios elaborados, sólo el algoritmo, por lo tanto la información se pasa por parámetros utilizando la variable global GET.

Cortar archivos o ficheros

Seleccione el archivo a cortar, cópielo en la raíz del proyecto y luego ejecute el proyecto en el navegador de la siguiente manera.

  • Parámetros - file=complete_document.pdf, parts=3 - [split.php]
https://127.0.0.1/Split-Files/split.php?file=complete_document.pdf&parts=3

Se creará un directorio con el nombre del archivo donde guardará las partes asignadas, todo en el proyecto raíz. 

split.php 	= Script que ejecuta el algoritmo de cortado.
file  		= Ruta del fichero o archivo a cortar.
parts 		= Número de partes a ser cortado.
Algoritmo split.php
<?php
    ini_set('display_errors', 1);
    error_reporting(-1);

	function splitFile($archivoOrigen, $cantidadPartes) {
	    /*Información que contiene información de la ruta del fichero (Array)*/
	    $PathFile = pathinfo($archivoOrigen);

	    /*Se crea un directorio con el mismo nombre del fichero, sólo en caso de que no exista*/
	    $pathDestino = $PathFile['dirname']."/".$PathFile['filename']."/";
	    if (!file_exists($pathDestino))
	        @mkdir($pathDestino, 0744);

	    /*Se apertura el fichero en modo lectura*/
	    $fileHandle = fopen($archivoOrigen, "r");

	    /*Se recorre la cantidad de partes en las que se dividirá el fichero*/
	    for ($nroParte = 1; $nroParte <= $cantidadPartes; $nroParte++) {

	        /*Se lee una parte del fichero*/
	        $filePart = fread($fileHandle, (filesize($archivoOrigen) / $cantidadPartes));

	        /*Se crea el fichero y se ejecuta*/
	        $filePartNew = fopen($pathDestino.$PathFile['filename'].$nroParte.".".$PathFile['extension'], 'w+');

	        /*Se hace un volcado de la información limite que extrajo del fichero original a la parte*/
	        fwrite($filePartNew, $filePart);

	        /*Se cierra la parte aperturada*/
	        fclose($filePartNew);
	    }

	    echo "Completed...";
	    /*Se cierra el fichero original*/
	    fclose($fileHandle);
	}

	#Verificación de los parámetros de la variable global GET
	if (isset($_GET))
		if (!empty($_GET['file']) && is_file($_GET['file']))
			if (!empty($_GET['parts']) && is_numeric($_GET['parts']))
				#Parámetro 1: Ruta del fichero a dividir, Parámetro 2: Cantidad de partes
				splitFile($_GET['file'], $_GET['parts']);
			else
				echo "Write the number of parts: split.php?file=".$_GET['file']."&parts=#";
		else
			echo "Enter the file path: split.php?file=C:/xampp/htdocs/Split-Files/document/test.pdf&parts=#";
	else
		echo "URL type GET not found.";
Unir archivos o ficheros

Los ficheros que se desean unir deben estar escritos con el mismo nombre del directorio, obviamente, se tendrá que enumerar esos ficheros, ejemplo: document/document1.pdf, document/document2.pdf, etc.

  • Parámetros - dirname=complete_document, type=pdf - [link.php]
https://127.0.0.1/Split-Files/link.php?dirname=complete_document&type=pdf
link.php 	= Script que ejecuta el algoritmo para unir.
dirname		= Ruta del directorio donde se encuentran los ficheros a unir.
type 		= La extensión o formato de los archivos a unir.
 Algoritmo link.php
<?php
	ini_set('display_errors', 1);
    error_reporting(-1);

	function joinFile($dirname, $type){
		#Se inicializa la variable iteradora.
		$i = 1;

		#Se obtienen los datos de la variable global GET
		$File = $_SERVER['DOCUMENT_ROOT']."/Split-Files/".$_GET['dirname']."/".$_GET['dirname'];
		$PathFile = "";
		
		#Se recorren los ficheros que existan.
		while (is_file($File.$i.".".$_GET['type'])){
			echo "<b>File found:</b> ".$File.$i.".".$_GET['type']."<br/>";

			#Se une el contenido de los ficheros encontrados.
			$PathFile .= file_get_contents($File.$i.".".$_GET['type']);
			$i++;
		}

		#Se crea un sólo fichero con el contenido de los ficheros encontrados.
		file_put_contents($_SERVER['DOCUMENT_ROOT']."/Split-Files/".$_GET['dirname']."_final.".$_GET['type'], $PathFile);
		echo "Finished...";
	}

	#Verificación de los parámetros de la variable global GET
	if (isset($_GET))
		if (!empty($_GET['dirname']) && is_dir($_GET['dirname']))
			if (!empty($_GET['type']))
				#Parámetro 1: Nombre del directorio, Parámetro 2: Extensión de los ficheros
				joinFile($_GET['dirname'], $_GET['type']);
			else
				echo "Enter the filetype: link.php?dirname=".$_GET['dirname']."&type=pdf";
		else
			echo "Enter the name directory: link.php?dirname=directory&type=pdf";
	else
		echo "URL type GET not found.";
?>

Se creará un el fichero único en la raíz del proyecto, con el nombre del directorio más la palabra "final" en este, ejemplo: complete_document_final.pdf.

Esta acción se puede hacer con cualquier fichero, con cualquier formato, no se preocupen si los ficheros multimedia que son acortados no funcionan individualmente, es normal, no pueden ejecutarse porque tienen cabeceras que las necesitan los demás, pero claro, si se vuelve a unir, todo funcionará con normalidad. Los ficheros de tipo texto, si podrán ser ejecutados con toda normalidad.

He elaborado un repositorio donde puedes encontrar fácilmente estos algoritmos, específicamente en el proyecto Split-Files.

 También puedes seguir el hilo sobre este asunto en la plataforma PHPCentral.

  • John Doe
    43 Sales$156,24 Totals
    62%
  • Rosy O'Dowell
    12 Leads$56,24 Totals
    32%

With supporting text below as a natural lead-in to additional content.

Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled.