UnTar mit PHP

In der Tat ist es eine Herausforderung.
Aber ich denke da wirst Du eine Menge zu tun haben.... PclZIP hat 5216 Zeilen Code. ;)

[edit] Aber schonmal gut zu wissen dass es auf jedenfall ein Weg gibt.... um PclZIP nutzen zu können, brauchte ich nur 8 Zeilen Code in mein Formular einzubinden. [/edit]
 
Zuletzt bearbeitet:
Wie Du siehst hat untar.php ja bei weitem nicht so viele Zeilen.
Und ich denke nicht, dass der Rest das Script so sehr aufblaeht.
 
Keine Ahnung.
PclZIP hat zwar eine menge Komentarzeilen, aber auch ohne die dürfte das Script sehr gross sein..... und dass sicherlich nicht grundlos. ;)
Ich bin schon auf dein Ergebnis gespannt.
 
Ich wollte mal kurz ein paar neue Infos loswerden.

Ich bin etwas weitergekommen. Mittlerweile weiss ich, dass vor den Daten 512 Bytes fuer Informationen kommen.
Danach halt die Daten, welche am Ende bis auf die naechsten vollen 512 Byte mit Nullen aufgefuellt werden.
Die Groesse eines .tar-Archives laesst sich also immer glatt durch 512 Teilen.

Jetzt muss ich nur noch herausfinden wie ich eindeutig bestimmen kann wo die Daten aufhoeren, denn eine Folge von Nullen koennte ja auch durchaus in reell existierenden Daten vorkommen.

Nachtrag:
Weitere Fortschritte sind zu verzeichnen. Ich kann nun feststellen wie gross die Daten sind. Muss noch etwas testen. Danach sollte es kein grosses Problem mehr darstellen das Script fertig zu schreiben.
 
Zuletzt bearbeitet:
Danke fuer den Hinweis.
Werd ich mir mal ansehen.
Soweit duerfte es jetzt eigentlich schon gehen.
Hab noch Probleme mit Dateien deren Groesse ein vielfaches von 512 ist.
 
Es ist geschafft. Es funktioniert.
Ich hab es auch getestet mit Dateien die 512 Byte (bzw. ein vielfaches davon) gross waren, und auch mit leeren Dateien.
Ich hatte keine Probleme.
Falls einer von Euch auf Probleme stoesst bitte kurze Info an mich.

untar.php
PHP:
<?php
if (isset($_GET['tar']))
	{
		$tarfile=fopen($_GET['tar'],"r");
		$datainfo="";
		$data="";
		while (!feof($tarfile))
			{
				$readdata=fread($tarfile,512);
				if (substr($readdata,257,5)=="ustar")
					{
						if (!empty($datainfo))
							{
								$poscount=0;
								$name="";
								while (substr($datainfo,$poscount,1)!=chr(0))
									{
										$name.=substr($datainfo,$poscount,1);
										$poscount++;
									}
								if (!empty($name))
									{
										if (substr($name,-1)=="/")
											{
												echo "Creating ".$name."<br>";
												mkdir($name);
											}
										else
											{
												echo "Extracting ".$name."<br>";
												$datasize=strlen($data)-1;
												while ((substr($data,$datasize,1)==chr(0)) && ($datasize>-1))
													{
														$datasize--;
													}
												$datasize++;
												$filedata="";
												for ($datacount=0;$datacount<$datasize;$datacount++)
													{
														$filedata.=substr($data,$datacount,1);
													}
												$file=fopen($name,"w");
												fwrite($file,$filedata);
												fclose($file);
											}
									}
								$datainfo=$readdata;
								$data="";
							}
						else
							{
								$datainfo=$readdata;
							}
					}
				else
					{
						$data.=$readdata;
					}
			}
		if (!empty($datainfo))
			{
				$poscount=0;
				$name="";
				while (substr($datainfo,$poscount,1)!=chr(0))
					{
						$name.=substr($datainfo,$poscount,1);
						$poscount++;
					}
				if (!empty($name))
					{
						if (substr($name,-1)=="/")
							{
								echo "Creating ".$name."<br>";
								mkdir($name);
							}
						else
							{
								echo "Extracting ".$name."<br>";
								$datasize=strlen($data)-1;
								while ((substr($data,$datasize,1)==chr(0)) && ($datasize>-1))
									{
										$datasize--;
									}
								$datasize++;
								$filedata="";
								for ($datacount=0;$datacount<$datasize;$datacount++)
									{
										$filedata.=substr($data,$datacount,1);
									}
								$file=fopen($name,"w");
								fwrite($file,$filedata);
								fclose($file);
							}
					}
				$datainfo=$readdata;
				$data="";
			}	
		fclose($tarfile);
	}
?>

Nachtrag:
Hab das ganze jetzt auch schon um gZip-/bZip2-Dekompression erweitert.
Das kommt dann wohl bald in der Tutorial- oder Code-Schnippsel-Section.
Oder eben bei Bedarf auf Anfrage. ;)
 
Zuletzt bearbeitet:
Hmm, irgendwie tut sich bei mir garnichts.
Aufrufen tue ich dass ganze so:
Code:
untar.php?tar=survey_A1.4.tar.gz
bzw. so:
Code:
untar.php?tar=archive.tgz
Oder ist es so verkehrt?!
An Zugriffrechten kann es jedenfalls nicht liegen.
Übertragen als "wwwrun", safe_mode=OFF.
Ich bekomme auch keine Fehlermeldung, die Seite bleibt leer, auch im Qelltext steht nichts.
 
Zurück