Mit PHP den Download einer Datei erzwingen

flukas

Mitglied
Hallo!

Ich möchte in eine HTML Seite ein Textfeld mit einem Link zu einer ganz bestimmten Datei irgendwo im Internet aufschreiben können und von dieser dann den Download(POST -> action="*.php") erzwingen lassen.

Ist das möglich, wie muss ich vorgehen?

mfg Flukas
 
Also zum Thema Downloads erzwingen mit PHP hatten wir hier schon diverse Themen.
Ich wuerde vorschlagen mal die Suchfunktion zu nutzen.

Kleiner Tipp: Vor kurzem gab's da erst was zum Thema Download von PDF erzwingen.
 
Die Systematik dahinter ist recht simpel: Das Formular übermittelt nur den URL/Dateipfad der Datei an ein PHP-Skript, das alles weitere regelt. Die dies im Detail funktioniert, solltest du über die Suchfunktion anhand unzähliger Themen/Beiträge erfahren können.
 
Also: Themen um Downloads zu erzwingen hast Du gefunden.
Wenn die Datei nicht auf Deinem Server liegt musst Du sie erst dort hin holen, per FTP oder HTTP. Danach kannst Du sie zum Download anbieten. Oder Du tunnelst direkt was Du ausliest zum User durch.
Ich weiss aber im Moment nicht so ganz ob das alles so legal ist was Du vor hast.
 
Ja, also ich versuche es nochmal verständlicher zu erklären.
HTML:
<form action="download.php" method="post">
 	<p><label>Pfad</label><input type="text" name="T1" size="55"></p>
	<p><input type="submit" value="Download" name="B1"></p>
</form>

Also die Seite besteht im Grunde nur aus einer "input box". Dort soll man die Adresse der herunterzuladenden Datei eingeben können und dann sollte sie heruntergeladen werden. Also ihr Download erzwungen werden.

Ist das möglich? Wie stellt man das an?

mfg Flukas
 
Ich frag mich schon die ganze Zeit welchen Sinn das haben soll.
Soll das eine Art Anonymizer sein?
Wenn Du sowas anbietest solltest Du Dir darueber klar sein welche Protokolle Du anbieten willst. HTTP wird wohl klar sein, aber was ist mit FTP? Vielleicht sogar Downloads ueber SCP oder rSync?

Falls allow_url_fopen=on ist, was es hoffentlich nicht ist, dann ist das ganze etwas einfachen, denn dann kannst Du den uebergebenen URL mit fopen() oeffnen und die Daten auslesen und zum User weiterschicken.
Anders falls kommst Du in den Genuss HTTP, bzw. FTP, nachbilden zu duerfen indem Du mit fsockopen() mit dem entsprechenden Server verbindest und dann wie ein Web-Browser, bzw. FTP-Client, die entsprechenden Befehle schickst.
 
Das soll den Sinn haben einfach durch die eingabe der URL eine Datei downloaden zu können, weil es bei z.B. HTML Seiten eher schwierig ist sie herunterzu laden und dann immer ein <a href="*.*">link</a> zu schreiben und sie dann per "Zeil speichern unter" zu programmieren eher mühsam ist, so wollte ich einmal so ein Script, das den download erzwingt. Es muss überhaupt kein anonymizer sein. Es soll nur den Zweck von dem oben erfüllen.

kannst du mir da einmal ein gutes Script erstellen?

mfg Flukas
 
Ich koennte Dir etwas Code zur Verfuegung stellen der Dich dabei gewaltig voran bringen koennte.
Ich hab mal, basierend auf meiner HTTP-Klasse, angefangen eine Art PHP-Proxy zu schreiben. Dort duerfte alles drin sein was Du brauchst. Vom erzwungenen Download abgesehen, aber dazu gibt es ja bereits einige Threads.
 
Das ist unguenstig.

So, da ja Weihnachten ist war ich mal so frei per Copy&Paste was zusammen zu schustern.
Ich gebe aber keine Garantie dass das Script auch funktioniert.
Wie gesagt, ich hab nur ein paar Teile Code zusammengeschoben und es nicht getestet.
Falls Probleme auftauchen und fuer zukuenftige Ideen rate ich Dir PHP zu lernen.

Das Script nutzt meine, bereits weiter oben verlinkte, HTTP-Klasse.

download.php
PHP:
<?php
function spliturl($url)
{
		$url_array=explode("://",$url);
		if (count($url_array)>1)
			{
				$protocol=$url_array[0];
				$url=$url_array[1];
			}
		else
			{
				$protocol="http";
				$url=$url_array[0];
			}
		$url_array=explode("?",$url);
		if (count($url_array)>1)
			{
				$parameters=$url_array[1];
			}
		else
			{
				$parameters="";
			}
		$url=$url_array[0];
		$url_array=explode("/",$url);
		if (count($url_array)>1)
			{
				$url=$url_array[0];
				unset($url_array[0]);
				$path=implode("/",$url_array);
			}
		else
			{
				$url=$url_array[0];
				$path="";
			}
		$url_array=explode(":",$url);
		if (count($url_array)>1)
			{
				$port=$url_array[1];
			}
		else
			{
				if ($protocol=="http")
					{
						$port=80;
					}
				elseif ($protocol=="https")
					{
						$port=443;
					}
			}
		$host=$url_array[0];
		$url=array("protocol"=>$protocol,"host"=>$host,"port"=>$port,"path"=>$path,"parameters"=>$parameters);
		return $url;
}

if (!empty($_POST['url']))
	{
		require("httpconnection.class.php");
		$url=spliturl($_POST['url']);
		if ($url['protocol']=="https")
			{
				$http=new httpconnection($url['host'],$url['port'],true,$_SERVER['HTTP_USER_AGENT']);
			}
		else
			{
				$http=new httpconnection($url['host'],$url['port'],false,$_SERVER['HTTP_USER_AGENT']);
			}
		$data=$http->get($url['path'],$url['parameters']);
		while (isset($data['head']['location']))
			{
				if (isset($data['head']['location']['parameters']))
					{
						$data=$http->get($data['head']['location']['uri'],$data['head']['location']['parameters']);
					}
				else
					{
						$data=$http->get($data['head']['location']['uri']);
					}
			}
		if (isset($data['head']['contenttype']))
			{
				header("Content-Type:".$data['head']['contenttype']);
			}
		header("Content-Disposition:attachment; filename=\"".$url['path']."\"");
		echo $data['body'];
	}
else
	{
		echo '<form method="post" action="download.php">';
		echo '<input type="text" name="url">';
		echo '<input type="submit" name="download" value="Download">';
		echo '</form>';
	}
?>
 
Zurück