[php]Trigga PHP med länk eller bild.

Permalänk

[php]Trigga PHP med länk eller bild.

Jag vill ha en knapp för användaren för att kunna spara en bild som är dynamiskt framtagen. Jag vet dock inte hur detta skall gå till, då JavaScript tydligen inte kan öppna en "spara mål som"-dialog och PHP inte kan trigga funktioner med klick på något på sidan.

Så som det ser ut just nu, så har jag en meny längst upp, en av menyknapparna skall trigga "spara bild som..".

<?php if(isset($_POST['fileName']) && !empty($_POST['fileName'])){ $fileName = $_POST["fileName"]; } else { $fileName = $_GET["fileName"]; } $filePath = '../../bin/' . $fileName . '.txt'; $handle = fopen( $filePath, 'rt' ); $stringListItems = fread($handle, filesize($filePath)); fclose($handle); $source = "../../bin/$fileName.png"; function saveImage(){ //Funktionen jag vill trigga header('Content-type: image/png'); header('Content-Disposition: attachment; filename=$fileName . ".png"'); readfile($source); } ?> <html> <head> <title>GPBM Nordic | <?php echo $fileName; ?></title> <link type="text/css" rel="stylesheet" href="../css/style.css" media="all"> <link type="text/css" rel="stylesheet" href="../css/print.css" media="print"> </head> <body> <div id="wrapper"> <header> <ul> <li id="goBack">Tillbaka</li> <li id="nextBtn" onclick="nextPage();">Spara bild</li> //Här vill jag trigga den </ul> <h1><?php echo $fileName; ?></h1> </header> <img src="../../img/logo.jpg" alt="Topplogo for GPBM Nordic Planogram tool" width="500" /> <div id="imageContainer"> <a href="<?php echo $source; ?>"> <img src="<?php echo $source; ?>" alt="Image for <?php echo $fileName; ?>" /> </a> </div> <div id="printList"><?php echo $stringListItems; ?></div> </div> </body> <script type="text/javascript"> document.getElementById("goBack").addEventListener("click", function(){ window.location="../../index.php"; }); </script> </html>

Hoppas jag inte skrivit för luddigt nu.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Lägg till ett argument till i din url om du vill ha den "sparad" eller inte?

<?php if(isset($_POST['fileName']) && !empty($_POST['fileName'])){ $fileName = $_POST["fileName"]; } else { $fileName = $_GET["fileName"]; } $filePath = '../../bin/' . $fileName . '.txt'; $handle = fopen( $filePath, 'rt' ); $stringListItems = fread($handle, filesize($filePath)); fclose($handle); $source = "../../bin/$fileName.png"; if(!empty($_GET['save'])) { header('Content-type: image/png'); header('Content-Disposition: attachment; filename=$fileName . ".png"'); readfile($source); } ?>

//C

Permalänk

havsmonstret: Jag gör en webbsida som har som krav att Tant Agda, 75, som aldrig sett en dator innan skall kunna använda. Det är minst sagt otroligt om en sådan person ens vet vad högerklick är.

conio: Hur triggar jag den? Vill inte lägga till formulär eller input, då knapparna ser så fruktansvärt fula ut och jag har redan ul-menyn. Hur triggar jag en refresh av sidan, med ett värde på save utan att ha en input eller form?

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem
Skrivet av morphman86:

havsmonstret: Jag gör en webbsida som har som krav att Tant Agda, 75, som aldrig sett en dator innan skall kunna använda. Det är minst sagt otroligt om en sådan person ens vet vad högerklick är.

conio: Hur triggar jag den? Vill inte lägga till formulär eller input, då knapparna ser så fruktansvärt fula ut och jag har redan ul-menyn. Hur triggar jag en refresh av sidan, med ett värde på save utan att ha en input eller form?

Du kan använda det som conio sa, men att du lägger in ?save=1 eller något i href. i länken

Permalänk
Medlem
Skrivet av morphman86:

conio: Hur triggar jag den? Vill inte lägga till formulär eller input, då knapparna ser så fruktansvärt fula ut och jag har redan ul-menyn. Hur triggar jag en refresh av sidan, med ett värde på save utan att ha en input eller form?

Det blir ingen refresh men du kan ju modifiera vart webbläsaren ska gå med javascript och windows.location. Då det dyker upp en spara ruta så kommer Agda vara kvar på sidan efter hon har sparat.

dvs något i stil med

<a onclick="window.location='.../image.php?fileName=bluff.jpg&save'; return false">Download</a>

Permalänk
Skrivet av conio:

Det blir ingen refresh men du kan ju modifiera vart webbläsaren ska gå med javascript och windows.location. Då det dyker upp en spara ruta så kommer Agda vara kvar på sidan efter hon har sparat.

dvs något i stil med

<a onclick="window.location='.../image.php?fileName=bluff.jpg&save'; return false">Download</a>

Jo, kom på det efter en kopp kaffe >.< Jag har varit borta från PHP'n ett par veckor nu och verkar ha glömt det mesta.

Edit: Nu skall jag bara ta reda på vad det är som gör att jag får en tom png-fil >.< Tror att det har att göra med readfile, men är inte säker.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem
Skrivet av morphman86:

Jo, kom på det efter en kopp kaffe >.< Jag har varit borta från PHP'n ett par veckor nu och verkar ha glömt det mesta.

Edit: Nu skall jag bara ta reda på vad det är som gör att jag får en tom png-fil >.< Tror att det har att göra med readfile, men är inte säker.

Tänkte du göra en sådan där javascript länk så är ju din första rad i koden lite felaktig då det är en GET.

if(isset($_POST['fileName']) && !empty($_POST['fileName'])){

Permalänk
Skrivet av conio:

Tänkte du göra en sådan där javascript länk så är ju din första rad i koden lite felaktig då det är en GET.

if(isset($_POST['fileName']) && !empty($_POST['fileName'])){

Därav elsen. Om det inte finns något i Post, så tar den från Get. Det är samma sträng, oavsett varifrån den kommer, men från vissa sidor kan annan information komma med, såsom bildens JS-kod (som kan vara uppemot 1000 tecken lång). För att slippa göra två nästan identiska sidor, la jag till denna if-sats så man kan använda denna sidan från vilken av de andra sidorna som helst, så länge fileName finns med (vilket den gör på alla sidor).

Om post inte är satt, eller om den är tom, kolla Get...

} else { $fileName = $_GET["fileName"]; }

Däremot tycks jag använda readfile fel. Har prövat på många olika sätt, men den vill tydligen inte leta bortom localhost efter filen.
Filen ligger i localhost/bin och php'n ligger i localhost/ext/php, så det naturliga vore ju om man skriver:

readfile('"../../bin/"' . $fileName . '".png"');

Men det ger fortfarande localhost som sökväg.
Samma med den alternativa syntaxen:

readfile($fileName . ".png", "../../bin");

Edit: Har med hjälp av file_exists fått reda på att sökvägen blir rätt, men den ger mig fortfarande en 3.2kb stor png som målfil, när källfilen är på över 200kb. Har dubbelkollat content_type också, och den stämmer, så vart ligger felet?

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk

Verkar som om den lägger till något, för målfilen blir 1kb större än källfilen nu när jag får en png ut. Målfilen blir korrumperad och jag vet inte varför.

Här är den uppdaterade koden:

if(isset($_POST['fileName']) && !empty($_POST['fileName'])){ $fileName = $_POST["fileName"]; } else { $fileName = $_GET["fileName"]; } $filePath = '../../bin/' . $fileName . '.txt'; $handle = fopen( $filePath, 'rt' ); $stringListItems = fread($handle, filesize($filePath)); fclose($handle); $imgFileName = $fileName . ".png"; $source = "../../bin/" . $imgFileName; $outName = $fileName; if(!empty($_GET['save'])) { if(file_exists($source)){ header('Content-type: image/png'); header('Content-Disposition: attachment; filename="' . $imgFileName . '"'); readfile($source); } else { $outName = $source . " finns inte"; } }

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Om filen som spottar ur sig bilden ser ut som i din första post så är det ju massa html-output som kommer ut också. Ska det vara en die() efter readfilen:n kanske?

//C

Permalänk
Medlem

Såg att du hade gjort om koden från ursprungsläget, men kan säga för framtida kodning att din function du hade inte hade fungerat pga att du inte skickat med $source som parameter, alltså hade $source inte funnits i det "variable scope".

OT:

Din nuvarande source är "../../bin/ " . $filename, är all denna kod i ett separat dokument som är inkluderad eller dyl? isf kan du testa två saker, testa att använda "readfile($source, true)" eller att anpassa sökvägen från det dokument som koden är inkluderad i!

Ett exempel från php.net:

<?php $file = 'monkey.gif'; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; } ?>

Permalänk

Simowewe: PHP-filen är den "sidan" som körs, den körs alltid från ext/php (alltså två "steg" under root, och bin är en undermapp till root).

conio: Till min vetskap finns ingen die till readfile.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Skrivet av morphman86:

Simowewe: PHP-filen är den "sidan" som körs, den körs alltid från ext/php (alltså två "steg" under root, och bin är en undermapp till root).

conio: Till min vetskap finns ingen die till readfile.

Till readfile? Han menade nog som han skrev, alltså bara die();

Permalänk
Skrivet av mel0dy:

Till readfile? Han menade nog som han skrev, alltså bara die();

det var flush() jag behövde Jag hade ingen flush innan readfile, så den läste filen fel.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10