[php] image downloaden

Pagina: 1
Acties:
  • 140 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
Ik wil een php-script maken dat een image ter download aanbiedt aan de browser.

Nu heb ik het volgende in elkaar gepuzzeld
PHP:
1
2
3
4
5
6
7
8
9
<?php
  $img = "test.jpg";

  header("Content-Type: application/x-unknown-image-JPEG");
  header('Content-Disposition: attachment; filename=' . $img);
  header('Content-Length: ' . file_size($img));

  read_file($img);
?>


Het werkt echter niet. Allereerst plakt Mozilla 1.1 er nog php achter de bestandsnaam, waardoor je het snel verkeerd opslaat. Mijn IE 5.5 doet 't wel goed. Daarnaast is het gedownloade bestand corrupt. Ik kan het niet openen en het is een stuk kleiner in bestandsgrootte.

Weet iemand hoe ik dit kan oplossen?

edit:
$iname naar $img, type foutje bij overtypen

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

  • Willem
  • Registratie: Februari 2001
  • Laatst online: 15:13
PHP != /13

Move W&G -> P&W :)

Acties:
  • 0 Henk 'm!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
die functies heten 'filesize' en 'readfile', dus zonder underscores.
en bestaat $iname wel?

[ Voor 0% gewijzigd door marcusk op 05-11-2002 17:34 . Reden: readfile is ook zonder _ ]


Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
marcusk schreef op 05 november 2002 @ 17:32:
die functies heten 'filesize' en 'readfile', dus zonder underscores.
en bestaat $iname wel?
K#t je hebt gelijk |:( 8)7. Komt ook door die file_exists() functie dan ga ik altijd weer twijfelen. Hij geeft natuurlijk een error in de ouput.

Blijft het probleem van de .php die er in mozilla aangeplakt wordt.

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
de naamgeving van php functies is inderdaad niet erg consequent.

hoe je dat probleem met mozilla kan oplossen weet ik niet.

Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19:48

Crazy D

I think we should take a look.

contenttype van plaatjes is toch image/* ? Voor jpeg dus image/jpeg. Dat is iig wat ik gebruik, en Mozilla plakt er bij mij geen .php achter :)

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 13-09 21:40
*zucht*
* Mithrandir wordt helemaal gek van die inconsequente (!?) naamgeving... *gaat sleutelen aan wat classes...*

Verbouwing


Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
Crazy_D schreef op 05 november 2002 @ 17:48:
contenttype van plaatjes is toch image/* ? Voor jpeg dus image/jpeg. Dat is iig wat ik gebruik, en Mozilla plakt er bij mij geen .php achter :)
Ook met image/* erachter plakt hij er bij mijn .ph achter. ;(

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

readfile is niet binary safe.
Gebruik liever http://www.php.net/fpassthru

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
drm schreef op 05 november 2002 @ 18:02:
readfile is niet binary safe.
Gebruik liever http://www.php.net/fpassthru
readfile() werkt prima, om fpassthru te gebruiken moet je eerst fopen doen.

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

  • Hmmbob
  • Registratie: September 2001
  • Laatst online: 12:25
je kan ook eigenwijs zijn.

er staat toch een duidelijke reden?

en dan doe je toch fopen? Als het gemak van een paar tekens minder typen je meer waard is dan de beveiliging, kan je net zo goed niet programmeren.

Sometimes you need to plan for coincidence


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Groentenboer
Heeft niet zo veel met beveiliging te maken, hoor, dus zo duidelijk is het kennelijk toch niet ;)

void
Heb je het al geprobeerd met fpassthru, want je hebt warempel verrekte dikke kans dat het dus wel een binary-safe probleem is :/

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
Groentenboer schreef op 05 november 2002 @ 18:18:
je kan ook eigenwijs zijn.

er staat toch een duidelijke reden?
...
Ik vind die reden niet zo duidelijk. In de manual van php wordt bij de functie van fpassthru zelfs aangeraden om readfile() te gebruiken.
Dat laatste heb ook geprobeerd en het maakt allemaal niets uit. Het bestand kwam al over en blijft dat doen. Het probleem dat Mozilla er .php achter plakt blijft echter. Ik denk dat dit eerder een header probleem.

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

Verwijderd

maak een bestand bijv. download.php en zet daar alleen dit in:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$filename = basename($file);
$len = filesize($file);
header("Cache-control: private");
header("content-type: application/stream");
header("content-length: $len");
header("content-disposition: attachment; filename=$filename");
$fp=fopen($file, "r");
fpassthru($fp);
?>


Je plaatje laten downloaden wordt dan een link als download.php?file=blabla

Dit kan je voor allerlei bestanden gebruiken, dus ook voor video's/muziek enz.

De "cache-control: private" staat er om een bug in IE 4.01 en 5.5 te omzeilen.
De "content-length" staat er zodat je browser bij het downloaden aan kan geven hoe groot het bestand is.

[ Voor 0% gewijzigd door Verwijderd op 06-11-2002 10:35 . Reden: codetag aangepast ]


Acties:
  • 0 Henk 'm!

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 15-07 09:34

PrinsEdje80

Holographic, not grated...

Verwijderd schreef op 06 november 2002 @ 10:32:
maak een bestand bijv. download.php en zet daar alleen dit in:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$filename = basename($file);
$len = filesize($file);
header("Cache-control: private");
header("content-type: application/stream");
header("content-length: $len");
header("content-disposition: attachment; filename=$filename");
$fp=fopen($file, "r");
fpassthru($fp);
?>


Je plaatje laten downloaden wordt dan een link als download.php?file=blabla

Dit kan je voor allerlei bestanden gebruiken, dus ook voor video's/muziek enz.

De "cache-control: private" staat er om een bug in IE 4.01 en 5.5 te omzeilen.
De "content-length" staat er zodat je browser bij het downloaden aan kan geven hoe groot het bestand is.
Deze is dan lekker veilig. Kun je al je includes uit php bestanden halen en dan vervolgens hieruit wachtwoordjes halen.
Lijkt me dus dat hier iig een extra beveiliging in gebouwd moet worden voor bepaalde bestandnamen...

Used to be Down Under... Foto gallery


Acties:
  • 0 Henk 'm!

Verwijderd

Deze is dan lekker veilig. Kun je al je includes uit php bestanden halen en dan vervolgens hieruit wachtwoordjes halen.
Lijkt me dus dat hier iig een extra beveiliging in gebouwd moet worden voor bepaalde bestandnamen...
hmm.... Goed dat je het zegt. Had ik nog niet aan gedacht. Niet dat ik paswoorden heb, maar ik heb wel een prive gedeelte met prive gegevens. :X Ga maar eens iets aan die beveiling doen ja.

[ Voor 0% gewijzigd door Verwijderd op 06-11-2002 10:59 . Reden: quotetag aangepast ]


Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
Ik heb ook jouw scriptje geprobeerd mantamanta, maar helaas:

Afbeeldingslocatie: http://picserver.student.utwente.nl/getpicture.php?id=25466

Nog steeds .php erachter

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

Verwijderd

Nog steeds .php erachter
raar... Ook in IE?
Als hij in beide browsers er .php achter gooit, kan je je scriptje ook aanpassen en de laatste 4 karakters uit je string halen.
bijv.
PHP:
1
$plaatje = substr("blaat.jpg.php", 0, -4);  // geeft "blaat.jpg"

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zie nu idd dat zowel Netscape 7.0 als Mozilla 1.1 er .php achtergooien 8)7
Internet Explorer doet het wel goed.

Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
Verwijderd schreef op 06 november 2002 @ 11:23:
raar... Ook in IE?
...
PHP:
1
$plaatje = substr("blaat.jpg.php", 0, -4);  // geeft "blaat.jpg"
Nee in IE gaat goed (ook 5.5), maar dat ging het vanaf het begin al. Ik verwacht niet dat dit wat uitmaakt aangezien je via de header dan nog steeds dezelfde naam doorgeeft. Het is iets wat Mozilla doet. Volgens mij is die browser eigenwijs.

"Je hebt op een php link geklikt, dus php zul je krijgen ook!!" 8)7

Opera is nog eigenwijzer aangezien die niet iets een download begint, maar gewoon het plaatje laat zien in de browser. Ook :'(.

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

herkent moz application/stream wel?

Volgens mij lost content-disposition: attachment met content-type: image/jpg het probleem op... Ik heb op mijn werk werkende code, ik zal daar morgen even naar kijken.

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19:48

Crazy D

I think we should take a look.

void schreef op 05 november 2002 @ 17:57:
Ook met image/* erachter plakt hij er bij mijn .ph achter. ;(
Oh * bedoelde ik de verschillende image-types mee, zoals gif, png, en jpeg.
Image/jpeg should do the trick...

Stukje uit mn code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");                          // HTTP/1.0

$mimetype = getImageMimeType($fullname);
header('Content-type: ' . $mimetype);
header('Content-Disposition: inline; filename=' . $imagename);

// en voor jpeg gebruik ik
ImageJpeg(@ImageCreateFromJPEG ($fullname));

(fullname is het path, imagename alleen de uh filenaam...)
mimetype is image/jpeg en dat werkt prima

(en ja de @Image... is niet netjes maar na een aantal controles dat o.a. de file ook echt bestaat, vond ik dat ik daar de @ wel mocht gebruiken :P)

Exact expert nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Als je script blaat.php heet, helpt het dan om blaat aan te roepen ipv blaat.php? Kan me voorstellen dat mozilla zich laat afleiden door de bestandsextensie.

Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
Crazy_D schreef op 06 november 2002 @ 12:00:
[...]
Oh * bedoelde ik de verschillende image-types mee, zoals gif, png, en jpeg.
Image/jpeg should do the trick...
...
Dat van die * had ik wel gesnapt, maar jouw code is niet om een plaatje te downloaden, maar om het in een browserwindow te laden.

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

Verwijderd

kvdveer schreef op 06 november 2002 @ 11:43:
herkent moz application/stream wel?

Volgens mij lost content-disposition: attachment met content-type: image/jpg het probleem op... Ik heb op mijn werk werkende code, ik zal daar morgen even naar kijken.
En? Hoe ziet de werkende code er dan uit? Ik heb net zelf iets geprobeerd.
M'n scriptje leest de extensie en zoekt vervolgens uit een lijst content-types de juiste.
Als ik nu Mozilla of Netscape gebruik en ik wil een video downloaden, dan laat hij hem gewoon zien in een quicktime ding op m'n site.
Dat doet hij niet als ik zeg "content-type: application/stream"
Dan wil hij hem namelijk wel downloaden, maar zet hij er automatisch ".php" achter 8)7

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:47

Knutselsmurf

LED's make things better

Ik gebruik zelf deze headers als ik een download af wil dwingen:
PHP:
1
2
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');


Misschien dat die wel goed werkt?

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Mijn code kan ik niet niet meer vinden helaas (|:().
Die code zag er volgens mij uit als de code van knutselsmurf. (zie boven)

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb eindelijk de goede code gevonden:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ext = strtolower(substr(strstr(substr($file,-7), "."),1));
if ($ext != "inc" and $ext != "php" and $ext != "log" and $ext != "txt" and $ext != "entrys" and $ext != "js" and $ext != "ini" and $ext != "psd") {
    $filename = basename($file);
    $len = filesize($file);
    header("Cache-control: private");
    header("content-type: application/stream");
    header("content-length: $len");
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    $fp=fopen($file, "r");
    fpassthru($fp);
    exit;
}
else {
print($ext);
print "<br><br>";
print "En dat mag dus niet...";
}


Ik lees eerst de extensie (misschien wat onhandig, maar het werkt).
Dan zeg ik dat hij bestanden met een bepaalde extensie niet mag downloaden.
"exit;" moet er eigenlijk ook bij. Dan sluit de browser na de download ook gelijk de connectie ipv dat hij wacht op een time-out.
De reden dat "application/stream" werkt, komt omdat volgens mij geen browser "stream" kent, en hem daarom altijd download ipv dat hij hem inline laat zien.

De truc om te zorgen dat netscape en mozilla er geen .php achterzetten is heel erg simpel:
zet "/" in je url na "download.php"
:X :X

Dus zo: "download.php/?file="

In Mozilla:
Afbeeldingslocatie: http://www.lynx10.nl/ff/mozilla.gif

In Netscape:
Afbeeldingslocatie: http://www.lynx10.nl/ff/netscape.gif

In Internet Explorer:
Afbeeldingslocatie: http://www.lynx10.nl/ff/ie.gif

Acties:
  • 0 Henk 'm!

  • void
  • Registratie: September 2000
  • Laatst online: 08-12-2023
Verwijderd schreef op 07 november 2002 @ 12:54:...
De truc om te zorgen dat netscape en mozilla er geen .php achterzetten is heel erg simpel:
zet "/" in je url na "download.php"
:X :X

Dus zo: "download.php/?file="
...
Dat werkt idd! Thanx MantaManta. _/-\o_

Le peintre de l'espace se jette dans le vide! (Y.Klein 1960)


Acties:
  • 0 Henk 'm!

Verwijderd

Deze is dan lekker veilig. Kun je al je includes uit php bestanden halen en dan vervolgens hieruit wachtwoordjes halen.
Lijkt me dus dat hier iig een extra beveiliging in gebouwd moet worden voor bepaalde bestandnamen...
Volgens mij kan je geen php scripts rechtstreeks downloaden van een server zonder ftp toegang, fopen maakt namelijk een http request bij de browser en daarvoor wordt hij al geparsed door de server.

Je krijgt dus alleen HTML. Ik daag iedereen uit een werkend script te plaatsen wat wel php files kan downloaden.

gr Deejay

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhm. En daar schop je een oud topic (2002!) voor? En dan gaat dit topic nog niet eens over het downloaden van de source, maar van een image (als in een dynamische image)...

En tot slot: Wedden dat het kan? Kwestie van geen php laten parsen, of 't als plain text door laten geven door een andere .php.

[ Voor 35% gewijzigd door RobIII op 16-11-2005 12:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op woensdag 16 november 2005 @ 12:39:
Ik daag iedereen uit een werkend script te plaatsen wat wel php files kan downloaden.
PHP:
1
fpasstru(fopen($_GET['filename'], 'rb'));


Wat heb ik gewonnen?


@NME : Die je vervolgens weer kwijtraakt doordat jij nog een echo of print toe moet voegen ;)

[ Voor 15% gewijzigd door Janoz op 16-11-2005 14:03 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Goed, beetje zinloos om hier zo'n oud topic voor te schoppen, niet? :)

@Janoz: Deze functie scheelt je een functieaanroep. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.