PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : nicht öffnen , downloaden


tinowittig
30.08.2006, 11:06:42
Hallo, ich habe mir ein Uploadscript geproggt (http://uploadhase.de) Jedoch wenn jemand ein bild hochläd, öffnet sich die URL, jedoch mchte ich nicht, das jemand die URL sieht! Wie kann ich das realisieren? Mit zip? oder gibt es da was, wie z.b, dass gleich das Speichern unter kommt?

Indyk
30.08.2006, 11:09:07
schon mal mit "mod-rewrite" gearbeitet?

tinowittig
30.08.2006, 11:12:55
Nein

Indyk
30.08.2006, 11:17:38
das ist ein php modul mit dem du urls bearbeiten kannst
du müsstest in diesem fall mit regulaeren ausdrücken
festhalten welche seiten du nicht angezeigt haben möchtest
und stattdessen z.b "upload.php" angeben.

hier sind mal zwei links zum informaieren
info 1 (http://www.modrewrite.de/mod_rewrite.apache.module.phtml)
Info 2 (http://www.modrewrite.info/index.html)

vll. nicht das was du suchst, aber es könnte dir helfen

tinowittig
30.08.2006, 11:47:22
Naja, ich kapiere das so richtig net, muss das in eine PH datei geschrieben werden? Kannst du mirnicht was schreiben?

Indyk
30.08.2006, 11:51:28
öhm nein kann ich nicht
weil das eine etwas umfangreiche lösung ist

die rewrite-rules muss man in eine htaccess datei schreiben.
und das modul muss auch installiert sein (siehe phpinfo())

ich meine ja auch nicht das es die optimale lösung ist
sondern eine, vll. kann dir hier jemand auch eine simpleren tipp geben.

MatMel
30.08.2006, 13:04:02
Du könntest Versuchen den MIME Typ des Headers auf irgendeinen Dateityp zu setzten, den der Browser runterläd und nicht anzeigt...

tinowittig
30.08.2006, 13:06:56
wie muss ich das machen?
Ich müsste dann nur einstellen was er öffnen darf(Php, html,..) oder? Gib mal ein BSp und sag mirbitte wie ich das machen soll,thx

MatMel
30.08.2006, 13:29:54
Mit
header("Content-Type: application/octet-stream");
header('Content-Disposition: attachment; filename="dateiname.jpg"');
setzt du den Typ der Datei auf ausführbare Datei. Das hab ich jetzt mal genommen weil die immer runtergeladen werden.
Die zweite Zeile gibt dem Browser den Dateinamen und sagt ihm, dass er es auf jeden Fall runterladen soll.
Eventuell kannst du sogar den Content-Type auf Bild lassen, wenn Content-Disposition auf attachment ist und er läd es trotzdem runter...
Musst du selber ausprobieren.

Dann musst du noch den Inhalt der Img Datei reinschreiben:

$filename = "bild.jpg";
$handle = fopen ($filename, "r");
$contents = fread ($handle, filesize ($filename));
echo $contents;
fclose($handle);


Aufpassen, dass du nicht außerhalb von <?PHP und ?> Leerzeichen oder Zeilenumbrüche hinmachst sonst machst du dir das Bild kaputt !

xabbuh
30.08.2006, 13:30:09
Mal eine generelle Frage: Was genau verstehst du unter "URL verstecken"?

MatMel
30.08.2006, 13:35:49
Oops ... wenn ich mir den Startpost so durchlese kommt mir die Ahnung, dass ich die Frage zuerst falsch verstanden hab...

Also das was du willst, dass niemand sieht wo die Dateien liegen, kannst du aber trotzdem mit dem machen was ich verher gepostet hab:

Du machst eine php Datei, die dann immer die Dateien läd. Der Benutzer sieht nur die php Datei und nicht woher die sich ihre Daten holt.
Den Ordner kannst du dann glaub ich sogar so einstellen, dass nur das php-Script und keine Leute von außen darauf Zugriff haben.

tinowittig
30.08.2006, 13:37:50
Danke, probiere es heute abend aus

Danke !

tinowittig
30.08.2006, 20:42:17
kannst mir das mal bitte komplet schreiben auch in <? ?> weil da kapiere ich das veilleicht noch!

thx

MatMel
31.08.2006, 00:00:36
Also

<?PHP
$filename = "deinVerzeichniss/" . $_GET['file'];
header('Content-Type: ' . mime_content_type($filename) );
header('Content-Disposition: attachment; filename="$filename"');
$handle = fopen ($filename, "r");
$contents = fread ($handle, filesize ($filename));
echo $contents;
fclose($handle);
?>
Das machste ohne irgendwas anderes in eine php Datei.
Dann kannst du immer per ?file=dateiname.exe den Dateinamen übergeben.
"deinVerzeichniss" musst du anpassen.

Irgendwie muss man dann noch den MIME Typ setzen, weiß ich aber grade nicht wie man den korrenkten da reinbekommet. (Zeile 3 wär das)
Also ich geb hiermit die Frage mal weiter ;)
edit: hab die verdammte Funktion jetz gefunden: mime_content_type()
Hab es oben im Code ergänzt!

tinowittig
31.08.2006, 12:25:42
Fatal error: Call to undefined function: mime_content_type() in
uploadhase.de\httpdocs\1.php on line 3

MatMel
31.08.2006, 12:29:37
Kopier noch das obendrüber:

<?php
if ( ! function_exists ( 'mime_content_type ' ) )
{
function mime_content_type ( $f )
{
return exec ( trim( 'file -bi ' . escapeshellarg ( $f ) ) ) ;
}
}
?>


Ansonsten nimm dir das zu Herzen:

ginnsu at arcee dot ca
09-Mar-2005 07:14
The function mime_content_type only worked for me on Microsoft Windows after I added the directive "mime_magic.debug" to my php.ini with the value of "On". The default value appears to be "Off". Exampe:

[mime_magic]
mime_magic.debug = On
mime_magic.magicfile = "c:\php\extras\magic.mime"


Cooljay
08-Nov-2004 03:22
This works on windows too. Make sure to uncomment the following in your php.ini file:
extension=php_mime_magic.dll

Also make sure to add the following line anywhere inside the php.ini file:
mime_magic.magicfile = "C:\path\to\php\install\magic.mime"

Voila working mime content types in windows :)

tinowittig
31.08.2006, 12:45:23
http://uploadhase.de/php.php

das ist meine PHP info, auf meinem Server kommt immer Bad Gateway

Bad Gateway
Web server received an invalid response while acting as a gateway or proxy server.

Vielleicht igend etwas in der PHP ini? auf einer anderen Website funktionert das

MatMel
31.08.2006, 12:48:41
Du hast meinen Code hochgeladen?
Und der bringt den Fehler
"Bad Gateway
Web server received an invalid response while acting as a gateway or proxy server." ?
Und auf anderen Server gehts?
Hast du das in der ini geändert was ich gepostet hatte oder nur die Funktion (das erste ) reinkopiert?

tinowittig
31.08.2006, 12:51:24
Wie muss ich das denn rein fügen oder was muss ich denn überhaupt machen?

tinowittig
31.08.2006, 12:58:16
extension=php_mime_magic.dll

ist drin


jetzt kommt aber

Fatal error: Cannot redeclare mime_content_type() in uploadhase.de\httpdocs\1.php on line 4

MatMel
31.08.2006, 13:00:33
Du erstellst eine php Datei (ich nenne sie im folgenden download.php) mit folgendem Inhalt:

<?PHP
if ( ! function_exists ( 'mime_content_type ' ) )
{
function mime_content_type ( $f )
{
return exec ( trim( 'file -bi ' . escapeshellarg ( $f ) ) ) ;
}
}
$filename = "" . $_GET['file'];
header('Content-Type: ' . mime_content_type($filename) );
header('Content-Disposition: attachment; filename="' . $filename . '"');
$handle = fopen ($filename, "r");
$contents = fread ($handle, filesize ($filename));
echo $contents;
fclose($handle);
?>

Die Dateien die du dem User zum download bieten willst machst du in den gleichen Ordner wie die php Datei. (in meinem Beispiel unten zum Beispiel die Datei meindownload.exe)
Dann kannst du die Dateien wie folgt runterladen:
http://www.host.de/download.php?file=meindownload.exe

Das mit der ini weglassen! Ich hab es bei mir mit dem obenstehenden Code getestet und es funktioniert wunderbar!

tinowittig
31.08.2006, 13:04:53
mmhhh, naja irgend wie geht das nicht aber ich kann versuchen mit xampp das zu machen und nicht mit plesk, aber im xampp zeigt es wieder alle inhalte der ordner wenn keine index.php(html) drin ist!

tinowittig
31.08.2006, 13:07:47
Ich habe es!

Man muss dann

if ( ! function_exists ( 'mime_content_type ' ) )
{
function mime_content_type ( $f )
{
return exec ( trim( 'file -bi ' . escapeshellarg ( $f ) ) ) ;
}
}
weglassen!

MatMel
31.08.2006, 13:19:26
Es kommt halt aufs System an, ob das benötigt wird...

Was du bitte noch umändern solltest:

$contents = fread ($handle, filesize ($filename));
mit
if(filesize($filename) > 0 ){
$contents = fread ($handle, filesize ($filename));
}
ersetzten!
Wenn nämlich die Datei leer ist, bringt fread einen Fehler, wenn es trotzdem ausgeführt wird.

Und dann kannst du das Script auch so einrichten, dass die Dateien, die gedownloaded werden sollen, in einem Unterverzeichniss liegen.
Dazu in der Zeile
$filename = "" . $_GET['file'];
zwischen den "" den Unterordner in der Form "Ordnername/" einfügen.
Es geht natürlich auch "Ordnername/Unterordner/" ...

Dann musst du dir noch gedanken über die Sicherheit machen.
Mit dem Script kann der User jeden beliebigen Dateinamen eintragen und somit auch jede Datei in dem Ordner downloaden. Einschließlich eventueller .htaccess Dateien.
Hast du keinen Unterordner definiert könnte er sogar durch eingabe von "download.php$file=../datei" auf den Ordner eine Ebene höher zugreifen.

[...]aber im xampp zeigt es wieder alle inhalte der ordner wenn keine index.php(html) drin ist!

Das lässt sich mit .htaccess Dateien regeln:
http://de.selfhtml.org/servercgi/server/htaccess.htm
Artikel "Verzeichnis-Optionen einstellen"