Avatar billede hans_henrik Nybegynder
10. november 2008 - 10:41 Der er 34 kommentarer og
1 løsning

Vise jpeg fra blob.

Jeg har en side hvor jeg ønsker at gemme jpeg dokumenter.
De er gewmt i databsen men når jeg viser dem, kommer det kun volapyk ud.

Jeg har lavet følgende:
$sql = "select id, date_format(Dato, '%e/%c-%y') as Datoen, Dokument from BGnyt Order By ID desc Limit 0, 1";

Det er Dokument som er blob med jpg gemt i databsen.
Med denne kode
  header('Content-Type: image/jpeg');
  header('Content-Disposition: inline; filename=file.jpg');
 
  $src_img = imagecreatefromstring($Dokument['image']);
  $dst_img = imagecreatetruecolor(100, 100);
  imagecopyresampled($dst_img, $src_img, 0,0,0,0, 100,100, imagesx($src_img), imagesy($src_img));
 
  imagejpeg($dst_img);

Hvad er det jeg gør forkert/mangler?
og som bonus spørgsmål, hvad nu hvis jeg vil gemme flere filtyper som dokument f.eks. word dokumenter og pdf filer? (Denne giver jeg gerne ekstra point for).
Avatar billede olebole Juniormester
10. november 2008 - 10:56 #1
<ole>

Prøv noget à la:

header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename=file.jpg');
$sql = "select id, date_format(Dato, '%e/%c-%y') as Datoen, Dokument from BGnyt Order By ID desc Limit 0, 1";
$res = mysql_query($sql) or die (mysql_error());
$row = mysql_fetch_assoc($res);
print $row["Dokument"];

/mvh
</bole>
Avatar billede hans_henrik Nybegynder
10. november 2008 - 11:50 #2
Det virker ikke.
Er det fordi jeg mangler en funktion???
Kan ikke lige se mysql_fetch_assoc nogen steder.
Avatar billede erikjacobsen Ekspert
10. november 2008 - 12:46 #3
"Det virker ikke." - på hvilken måde, og med hvilken kode?
mysql_fetch_assoc er en indbygget funktion, men der mangler selvfølgelig at oprette forbindelse til server og database. Det er tilladt at tænke selv ;)
Og så kan jeg ikke se hvad du skal bruge datoen til??
Avatar billede olebole Juniormester
10. november 2008 - 12:49 #4
http://dk2.php.net/manual/en/function.mysql-fetch-assoc.php

- men jeg kan ikke undlade at undre mig. Har du overhovedet kodet PHP/MySQL før?
Avatar billede hans_henrik Nybegynder
10. november 2008 - 13:36 #5
Hej olebole.
Ja jeg har kodet php mysql før.
Men ikke med filer vedhæftet.
Hvis jeg kører med en echo $dokument; og uploader et word dokument kommer det også fint ud.
Jeg kan godt se det ikke virker med jpg'er og kæmper for at finde ud af hvordan det virker.
Grunden til datoen skal med er at det er til scannede nyhedsbreve fra en børnehave og man skal kunne se hvad dato det er fra.
Bla. fordi der også skal laves et arkiv med gamle data.
Jeg får datoen ud, men ikke jpg'en.

Jeg har ikke uploadet hele min kode, da den fylder en del.
Avatar billede olebole Juniormester
10. november 2008 - 14:06 #6
"Hvis jeg kører med en echo $dokument; og uploader et word dokument kommer det også fint ud." >> Det må du ikke forvente, andre skal kunne forstå, hvad du mener med  =)

Da vi ikke ved, hvad du gør, er det ret umuligt at foreslå, hvad du skal gøre i stedet
Avatar billede olebole Juniormester
10. november 2008 - 14:08 #7
- men da du ikke kender mysql_fetch_assoc, er det nu meget svært at forestille sig, du har kodet PHP/MySQL før. Det kan godtnok ikke være ret meget  =)
Avatar billede hans_henrik Nybegynder
10. november 2008 - 15:08 #8
Nu var spørgsmålet jo ikke hvor meget php jeg har kodet, og hvis jeg var ekspert havde jeg nok heller ikke behov for at spørge om hjælp.
Det meste jeg har lavet har været med flad tekst og tal, og her har jeg kunnet klare mig med de simple funktioner som $sql = select "......";
Kalde databsen og få indput og så en echo variabel$
Dette virker ikke med jpg images og jeg spørger derfor hvordan det kommer til at virke.
Jeg kan se ideen i dit svar men får nu blot datoen, men ikke noget billede.

Hvis jeg kigger i kildekoden for siden når den vises er der heller intet billed objekt i linien efter datoen som jeg forventer.
Avatar billede erikjacobsen Ekspert
10. november 2008 - 16:50 #9
"i linien efter datoen" ??? Det er ikke noget af den kode her i spørgsmålet, der udskriver datoen. Så er vi tilbage til mit spørgsmål fra før: med hvilken kode.

Jeg er dybest set ligeglad, men hvis du ikke er, og vil have løst dit problem, må du komme med flere oplysninger.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 19:29 #10
Hej igen.

Hermed er større uddrag af min kode.

header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=file.jpg");
$sql = "select id, date_format(Dato, '%e/%c-%y') as Datoen, Dokument from BGnyt Order By ID desc Limit 0, 1";
$taeller_sql = "select count(*) as antal from BGnyt";

aabn_forbindelse_og_vaelgdb();
$resultat = sql_spoerg_og_faa_svar($sql);
$optaelling = sql_spoerg_og_faa_svar($taeller_sql);
luk_forbindelse();

?>
    <!-- PHP slutter/pause - For HTML formatering. -->
<h1>Børnegårdsnyt: <?php echo $Datoen; ?></h1>
    <!-- PHP starter igen -->
<?php

$row = mysql_fetch_assoc($resultat);
print $row["Dokument"];
Avatar billede olebole Juniormester
10. november 2008 - 19:35 #11
- og så må jeg gentage Erik: "Jeg er dybest set ligeglad, men hvis du ikke er, og vil have løst dit problem, må du komme med flere oplysninger."
Avatar billede hans_henrik Nybegynder
10. november 2008 - 19:37 #12
Jeg har lige lagt koden på siden igen, mangler der mere?
Avatar billede olebole Juniormester
10. november 2008 - 19:40 #13
Hvad sker her:

aabn_forbindelse_og_vaelgdb();
$resultat = sql_spoerg_og_faa_svar($sql);
$optaelling = sql_spoerg_og_faa_svar($taeller_sql);
luk_forbindelse();
Avatar billede hans_henrik Nybegynder
10. november 2008 - 19:43 #14
Den laver en connect til databasen.
Så laver den en sql query defineret i $sql ($sql = "select id, date_format(Dato, '%e/%c-%y') as Datoen, Dokument from BGnyt Order By ID desc Limit 0, 1")
Samt en optælling af hvor mange entrys der er i Databasen ($taeller_sql = "select count(*) as antal from BGnyt";)
Til sidst lukker den databasen igen.

Det skyldes at senere skal bruge alle entrys til en oversigt over filer/billeder i en navigagtions menu, men her skal jeg kun bruge Datoen og det fungerer fint.
Avatar billede erikjacobsen Ekspert
10. november 2008 - 19:55 #15
Jeg kan se du blander billede og HTML sammen. Det kan man ikke.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 20:05 #16
Jeg prøver lige at lave den om uden HTML og melder tilbage.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 20:12 #17
Hej igen.
Nu har jeg lavet en simpel test side med denne kode.
Alt den skal gøre er at finde seneste entry i databasen og udskrive Dato samt billede.
Mit output er datoen.
Der ligger et jpg billede gemt som blob i seneste database entry, som i øvrigt er den eneste lige nu.

<?php

require("./funktioner/mysql-funktioner.php");
require("./funktioner/design-funktioner.php");
require("./funktioner/indstillinger.php");

#
# Vi henter to ting ud af MySQL - først og fremmest alle de indlæg vi skal kigge på
# men også en hurtig optælling af, hvor mange indlæg der er ialt. Det sidste skal vi
# bruge når vi bygger "frem"- og "tilbage"-links.
#
# Der er ingen grund til at åbne databasen endnu - vi skal først lige have bygget
# de to forespørgsler.
#

header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=file.jpg");
$sql = "select id, date_format(Dato, '%e/%c-%y') as Datoen, Dokument from BGnyt Order By ID desc Limit 0, 1";

#
# Nu åbner vi databasen, hiver informationerne ud og lukker med det samme igen.
# Det er god skik at en forbindelse til database ikke er åben længere end højst nødvendigt.
#
# Abstraktionerne fra mysql-funktioner.php sørger for alt det grove arbejde og fejlhåndtering - dejligt.
#

aabn_forbindelse_og_vaelgdb();
$resultat = sql_spoerg_og_faa_svar($sql);
luk_forbindelse();
extract($resultat[0]);

    echo $Datoen;
    $row = mysql_fetch_assoc($resultat);
    print $row["Dokument"];

?>

Håber i kloge hoveder kan hjælpe.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 20:29 #18
Hvis jeg laver denne:
<?php

require("./funktioner/mysql-funktioner.php");
require("./funktioner/design-funktioner.php");
require("./funktioner/indstillinger.php");

#
# Vi henter to ting ud af MySQL - først og fremmest alle de indlæg vi skal kigge på
# men også en hurtig optælling af, hvor mange indlæg der er ialt. Det sidste skal vi
# bruge når vi bygger "frem"- og "tilbage"-links.
#
# Der er ingen grund til at åbne databasen endnu - vi skal først lige have bygget
# de to forespørgsler.
#

header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=file.jpg");
$sql = "select id, date_format(Dato, '%e/%c-%y') as Datoen, Dokument from BGnyt Order By ID desc Limit 0, 1";

#
# Nu åbner vi databasen, hiver informationerne ud og lukker med det samme igen.
# Det er god skik at en forbindelse til database ikke er åben længere end højst nødvendigt.
#
# Abstraktionerne fra mysql-funktioner.php sørger for alt det grove arbejde og fejlhåndtering - dejligt.
#

aabn_forbindelse_og_vaelgdb();
$resultat = sql_spoerg_og_faa_svar($sql);
luk_forbindelse();
    $row = mysql_fetch_assoc($resultat[0]);
    print $row["Datoen"];
    print $row["Dokument"];

?>

Får jeg en blank skærm, er det min query der på en eller anden måde bliver blank eller hvad sker der?
Avatar billede erikjacobsen Ekspert
10. november 2008 - 20:41 #19
Men du skal skrive billedet ud, ikke datoen. Du kan ikke blande tekst (og html) og så et billede. Drop linien med    print $row["Datoen"];    og se hvad der sker. Og hvis ikke det virker, så skal vi lige have et link, ik'?
Avatar billede erikjacobsen Ekspert
10. november 2008 - 20:43 #20
Og så skal du ikke lukke forbindelse, før du er færdig med at hente data.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 20:46 #21
Så ser koden således ud:
<?php

require("./funktioner/mysql-funktioner.php");
require("./funktioner/design-funktioner.php");
require("./funktioner/indstillinger.php");

#
# Vi henter to ting ud af MySQL - først og fremmest alle de indlæg vi skal kigge på
# men også en hurtig optælling af, hvor mange indlæg der er ialt. Det sidste skal vi
# bruge når vi bygger "frem"- og "tilbage"-links.
#
# Der er ingen grund til at åbne databasen endnu - vi skal først lige have bygget
# de to forespørgsler.
#

header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=file.jpg");
$sql = "select id, date_format(Dato, '%e/%c-%y') as Datoen, Dokument from BGnyt Order By ID desc Limit 0, 1";

#
# Nu åbner vi databasen, hiver informationerne ud og lukker med det samme igen.
# Det er god skik at en forbindelse til database ikke er åben længere end højst nødvendigt.
#
# Abstraktionerne fra mysql-funktioner.php sørger for alt det grove arbejde og fejlhåndtering - dejligt.
#

aabn_forbindelse_og_vaelgdb();
$resultat = sql_spoerg_og_faa_svar($sql);
luk_forbindelse();
    $row = mysql_fetch_assoc($resultat[0]);
    print $row["Dokument"];

?>

Jeg får en blank skærm.

Linket er: http://www.bagger-paulsen.dk/ob/bgnyt-test.php
Avatar billede erikjacobsen Ekspert
10. november 2008 - 20:48 #22
Og endelig ved vi ikke hvad sql_spoerg_og_faa_svar laver.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 20:49 #23
Jeg har lige slået PHP error messages til.
Måske der kommer en fejl når den er opdateret.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 20:50 #24
Koden kommer her:
<?php
/*
* Titel    : MySQL abstraktion
* Version  : $Id: mysql-funktioner.phps,v 1.1 2001/07/18 21:29:13 webclaus Exp $
* Kodet af  : Villy Thomsen (villyft@webcafe.dk)
* Placering : http://webcafe.dk/php/artikler/204/mysql_funktioner
* Formål    : en abstraktion over the MySQL funktionerne i PHP, som
*            klarer alle de "trælse" ting, så som at åbne/lukke
*            forbindelser og håndtere fejl fra MYSQL.
*/


function aabn_forbindelse_og_vaelgdb() {
  $server = "localhost";
  $bruger = "brugernavn
  $kodeord = "password";
  $database = "database";


  if (!mysql_connect("$server","$bruger","$kodeord")) {
    udskriv_fejl("Kunne ikke oprette en forbindelse til MySQL.");
  }

  if(!mysql_select_db("$database")) {
    udskriv_fejl("Kunne ikke vælge databasen: $database");
  }
}

function sql_spoerg_og_faa_svar($query) {
  $resultat = mysql_query($query);

  if(!$resultat) {
    udskriv_fejl("Kunne ikke udføre: <em>$query</em>");
  }

  while($raekke = mysql_fetch_array($resultat)) {
    $resultat_array[] = $raekke;
  }

  return $resultat_array;
}

function sql_spoerg($query) {
  $resultat = mysql_query($query);

  if(!$resultat) {
    udskriv_fejl("Kunne ikke udføre: <em>$query</em>");
  }
}

function luk_forbindelse() {
  if(!mysql_close()) {
    udskriv_fejl("Kunne ikke lukke forbindelsen til MySQL!");
  }
}

function udskriv_fejl($fejl) {
  echo "<p>$fejl";

  if ($mysql_fejl = mysql_error()) {
    echo "<br>Fejlen er: <em>$mysql_fejl</em>";
  }

  exit;
}
?>
Avatar billede erikjacobsen Ekspert
10. november 2008 - 20:58 #25
Ok - det er så ok. Men jeg kan bare ikke regne ud hvorfor du spilder din egen tid ved at holde indholdet af de funktioner hemmelige for os.

Måske skal du ændre disse ting:

$sql = "select Dokument from BGnyt Order By ID desc Limit 0, 1";

og så:

aabn_forbindelse_og_vaelgdb();
$resultat = sql_spoerg_og_faa_svar($sql);
luk_forbindelse();
print $resultat[0][0];
Avatar billede hans_henrik Nybegynder
10. november 2008 - 21:04 #26
Erik, du er genial det virker.
Smid et svar og du får point.

Ved du om man kan lave tilsvarende med en pdf?
Avatar billede erikjacobsen Ekspert
10. november 2008 - 21:06 #27
Det kan man. Men det er ikke synderlig smart at smide store ting i felter i en database. Selv om man kan. Jeg vil godt vædde en bøjet 25-øre på at one.com kommer efter dig for overtrædelse af deres "fair" use policy. Billeder, pdf-filer etc skal gemmes som almindelige filer.

Jeg samler slet ikke på point, tak.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 21:13 #28
Det må jeg lige undersøge med dem.
Men tak for hjælpen det virker nu, har også fået det til at virke med pdf. ved at ændre typen i header.
Avatar billede erikjacobsen Ekspert
10. november 2008 - 21:14 #29
Det kommer såmænd også helt af sig selv, når dine dokumenter kommer over et par MB eller 3, eller hvad grænsen nu er.
Avatar billede erikjacobsen Ekspert
10. november 2008 - 21:19 #30
Og en sjov Dilbert du har valgt. Får mig til at tænke på eksperten.dk ;)
Avatar billede hans_henrik Nybegynder
10. november 2008 - 21:27 #31
Nu har jeg lavet typen om til pdf, og den åbner fint men den åbner både i explorer og i adobe reader, kan man sikre den kun gør det i explorer?
Avatar billede hans_henrik Nybegynder
10. november 2008 - 21:29 #32
Det er linket http://www.bagger-paulsen.dk/ob/bgnyt.php
og det eneste jeg har ændret er header fra jpeg til pdf.
Og så oprettet et nyt dokument i databasen.
Avatar billede erikjacobsen Ekspert
10. november 2008 - 21:33 #33
Jeg bruger ikke IE, men i Firefox ser den ud til kun at åbne PDF-filen.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 21:35 #34
takker så er det bare IE crap, desværre er brugerne af dette system primært IE brugere.
Avatar billede hans_henrik Nybegynder
10. november 2008 - 21:35 #35
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester