Dateien Splitten

danza

Erfahrenes Mitglied
Folgendes ich versuche eine Datei in diesem fall ca. um die 10mb auf zusplitten in mehrere kleine Dateien die ca. 1MB groß sind. In meinem Falle müssten es ca. 11 Pakete sein.

Die Pakete werden auch erstellt im Ordner test_pakete und heißen dann 1.txt, 2.txt, 3txt usw. die jeweils ca. 1mb groß sind.

Der Download klappt auch, d.h. Download Fenster kommt und lädt die Daten herunter, das Problem was entsteht ist, das die Datei danach unbrauchbar ist, ich denke das es an der Codierung oder so liegt, wäre dankbar für eine Lösung ohne Shell, da das Skript nicht nur auf meinen Root laufen soll.

Skript:
PHP:
<?php 
	$file_verzeichnis = '/var/www/files/';
	$file_name = 'nfsug2v1-2ge.zip';
	$file_pfad = $file_verzeichnis.$file_name;
	$datei = fopen($file_pfad,"r+");
	$i = 0;
	$paket_nummer = 0;
	 while (!  feof( $datei )) {
		$i++;		
	   $zeile  = fgets( $datei);
	   $paket .= $zeile;
	   $byte_zeile =  mb_strlen($zeile);
	   $byte_paket = $byte_zeile+$byte_paket;
	   #Pakete erstellen wenn größer als 1000000bytes in etwa leicht unter 1mb
		if($byte_paket>1000000) {
			$paket_nummer++;
			$mb_zeile = $byte_paket/1024/1024;
			$byte_gesamt = $byte_paket+$byte_gesamt;
			#echo "Paket: ".$byte_paket." in mb: $mb_zeile ($i Zeilen und $paket_nummer Paket Nummer)<br>\n";
			 $dateiname = "test_pakete/$paket_nummer.txt"; // Name der Datei
			 $handler = fopen($dateiname , "a+"); // Datei öffnen, wenn nicht vorhanden dann wird die Datei erstellt.
			 fwrite($handler , $paket); // Dateiinhalt in die Datei schreiben
			 fclose($handler); // Datei schließen

			$i = 0;
			$byte_paket = 0;
			$paket = '';
		}
	}
	fclose($datei);
	# Das letzte halbe Paket speichern!
	if($byte_zeile>0) {
		$paket_nummer++;
		$mb_zeile = $byte_paket/1024/1024;
		$byte_gesamt = $byte_paket+$byte_gesamt;
		#echo "Paket: ".$byte_paket." in mb: $mb_zeile ($i Zeilen und $paket_nummer Paket Nummer)<br>\n";
		$dateiname = "test_pakete/$paket_nummer.txt"; 
		$handler = fopen($dateiname , "a+");
		fwrite($handler , $paket);
		fclose($handler);
	}
	
	$i = 0;
	$byte_paket = 0;
	$paket = '';

	# Download initalisieren und Pakete zusammen setzen
	  
	header( 'Content-type: application/octet-stream' );
	header( 'Content-Disposition: attachment; filename="' . $file_name . '"' );
	header( 'Content-Length: ' . filesize( $byte_gesamt ) );


	for($i=1;$i<=$paket_nummer;$i++) {
		echo file_get_contents('/var/www/sync/test_pakete/'.$i.'.txt');
	}
  ?>
 
Zurück