Avatar billede nexus-6 Nybegynder
01. marts 2003 - 16:43 Der er 27 kommentarer og
1 løsning

fread og fopen ???

Hejsa.
Har lige lavet/fundet et script der uploader en .jpeg fil til min mysql db. I scriptet forkommer denne linie lige inden at filen bliver smidt ind i databasen:

addslashes(fread(fopen($filename,"rb"),filesize($filename)));

Hvad er det lige det er at fread() og fopen() gør ? og hvorfor bruges de lige i denne sammenhæng ?

Jeg har prøvet at kigge på php.net men det fik jeg ikke så meget ud af.
Min nysgerrihed omkring fread og fopen kom da jeg ville trække billedet ud af databasen og lave et thumbnail af billedet, hvor jeg fik denne fejl:

Warning: imagecreatefromjpeg(ÿØÿà) [function.imagecreatefromjpeg]: failed to create stream: No such file or directory in c:\bla..bla..bla

Linien hvor det går galt er:
$src_img=ImageCreateFromJPEG($file);

Iføgle den Warning indeholder $file "ÿØÿà" og ikke et filnavn. Det er her jeg kom til at tænke på fread() og fopen.
Nogen der kan give en forklaring ?

På forhånd tak
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 16:55 #1
Feltet indeholder dit billede - ikke navnet på det.
fopen/fread læser indholdet af en fil.
Du skal groft sagt blot smide indholdet af feltet direkte i
hovedet på brugeren. Har du ikke et eksempel at skrive af
efter?
Avatar billede Slettet bruger
01. marts 2003 - 16:58 #2
fopen(); åbner filen til skrivning og læsning (returnerer en filepointer)
fread($fp, $length); //læser $length bytes fra $fp (filepointeren til en given fil)

I det konkrete eksempel kan du bruge file_get_contents($filename) i stedet for fread(fopen($filename,"rb"),filesize($filename));
Avatar billede Slettet bruger
01. marts 2003 - 17:01 #3
Se også http://www.eksperten.dk/spm/322483 ... der har du forklaringen på at det ikke virker!
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 17:24 #4
Her er filen der skal laveet et thumbnail:

$sql = "SELECT file, type FROM pix where id='$id'";
sql_connect();
$result = sql_query_anwser($sql);
sql_close();
extract($result[0]);
$scale = 100/$width;
$new_width = $width*$scale; 
$dst_img=ImageCreate($new_w,'100');
$src_img=ImageCreateFromJPEG($file);
ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_width,100,ImageSX($src_img),ImageSY($src_img));
ImageJPEG($dst_img);
header("Content-type: $type");
echo $dst_img;

Filen der gemmer billedet i databasen:

$filename = $_FILES['billede']['tmp_name'];
if (is_uploaded_file($filename)) {
    $data = addslashes(fread(fopen($filename,"rb"),filesize($filename)));
    $a=getimagesize($filename);
    $width=$a[0]; $height=$a[1];
    $type=addslashes($_FILES['billede']['type']);
    $sql = "INSERT INTO pix SET file='$data', type='$type', text='test billede', height='$height', width='$width'";
    sql_connect();
    sql_query($sql);
    sql_close();
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 17:32 #5
Ja, du kan i hvert fald ikke bruge
imagecreatefromjpeg, der kræver et filnavn.
Hvorfor laver du ikke dit thumbnail ved upload og
putter det i databasen også?
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 17:43 #6
Jo det kunne jeg jo egentlig godt, hvilket oxo ville gøre siden lidt hurtigere at den ikke skal lave fx. 16 nye billeder. Men så da bare for interessens skyld, kan man ikke gå baglæns og lave en fil ud fra indeholde i databasen ?
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 17:50 #7
Jo, men det er da lidt tosset :)
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 17:52 #8
Læs forøvrigt
http://www.useit.com/alertbox/9611.html
afsnittet:
Relevance-Enhanced Image Reduction: Better Thumbnails
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 17:52 #9
okey... =)
Jeg siger mange tak for hjælpen.
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 17:54 #10
okey skal jeg gøre.
Smid lige et svar hvis du vil have point.
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 17:57 #11
nej tak - ingen point til mig
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 18:09 #12
regin! hvis du vil have piont saa smid et svar.
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 19:00 #13
hmm... ligesom jeg troede at den var hjemme opstår der selfølgelig nu problemer :(
Problemet ligger i at jeg ikke kan få smidt det nye "thumbnail" billed lagt ned i en fil saa jeg kan smide den i min database. Jeg har prøvet med det her:

$dst_img=ImageCreate($new_w, $new_h);
$src_img=ImageCreateFromJPEG($filename);
ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_width,$new_h,ImageSX($src_img),ImageSY($src_img));
$tmpfname = tempnam("/tmp", "tempfil");  // lave en temp file
Imagejpeg($dst_img, $tmpfname);  //Skulle kopiere det nye bllede over i temp filen
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 19:08 #14
Lav dit eget katalog, med skrivetilladelse.
Men du behøver ikke lave filen. Du kan tage
$dst_img fra før og putte direkte i databasen
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 19:50 #15
har prøvet:
$dst_img=ImageCreate($new_width, $new_height);
$src_img=ImageCreateFromJPEG($filename);
ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_width,$new_height,ImageSX($src_img),ImageSY($src_img));

$sql = "INSERT INTO pix SET file='$file', thumbnail='$dst_img', type='$type', text='test billede', height='$height', width='$width', height2='$new_height', width2='$new_width'";

men har fundet ud af at data'en i $dst_img ikke er helt ok.. er der et eller andet jeg skal gøre med den første ?
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 19:55 #16
addslashes
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 20:02 #17
Troede jeg oxo, men det virker heller ikke...
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 20:03 #18
din kode?
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 20:06 #19
Her er hele min kode der lægger datan ind i databasen:

<?php
require("../requireMysql.php");
$filename = $_FILES['billede']['tmp_name'];
if (is_uploaded_file($filename)) {
    //-------------------Original image------------------------------
    $file = addslashes(fread(fopen($filename,"rb"),filesize($filename)));
    $a=getimagesize($filename);
    $width=$a[0]; $height=$a[1];
    $type=addslashes($_FILES['billede']['type']);
       
    //--------------------thumbnail-----------------------------
    $new_height = "100";
    $scale = $new_height/$height;
    $new_width = $width * $scale; 
    $dst_img=ImageCreate($new_width, $new_height);
    $src_img=ImageCreateFromJPEG($filename);
    ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_width,$new_height,ImageSX($src_img),ImageSY($src_img));
    $dst_img = addslashes($dst_img);
    $sql = "INSERT INTO pix SET file='$file', thumbnail='$dst_img', type='$type', text='test billede', height='$height', width='$width', height2='$new_height', width2='$new_width'";
    sql_connect();
    sql_query($sql);
    sql_close();
    header("Location:read.php");

}else{
    echo "Possible file upload attack. Filename:" . $HTTP_POST_FILES['billede']['name'];
}
?>
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 20:09 #20
Nå da - det ser godt ud. Hvad siger den til det?
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 20:21 #21
Den kommer ikke med nogen fejlmeddelse, men der kommer bare ikke noget billede frem :(
Grunden til at jeg ved at det er data'en den er galt med er, at jeg med phpmyadmin har prøvet at overskreve feltet "thumbnail" med en billede fil. Og så kan den lige pludselig godt udskrive billedet.
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 20:39 #22
Hov - mangler der en:
ImageJPEG($dst_img);
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 20:50 #23
Det gik den helt amok over, men hvad jeg kunne for stå på php.net, så har ImageJPEG(); to muligheder: at udskrive billedet til skærmen direkte eller til en fil.
Men det er vel ikke det vi har brug for her. Vi vil jo have den ned i en database.
Avatar billede erikjacobsen Ekspert
01. marts 2003 - 20:54 #24
Nå, ja, jo. Det er jo noget rod. Men så skriv det da på en fil, og læs den ind.
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 21:05 #25
Nu kommer den så til at se sådanne ud:

$new_height = "100";
$scale = $new_height/$height;
$new_width = $width * $scale; 
$dst_img=ImageCreate($new_width, $new_height);
$src_img=ImageCreateFromJPEG($filename);
ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_width,$new_height,ImageSX($src_img),ImageSY($src_img));
//$dst_img = addslashes($dst_img); ---- er ikke sikker på at eden skal med, tror det ikke
$tmpfname = tempnam("/tmp", "tempfil");  // lave en temp file
Imagejpeg($dst_img, $tmpfname);  //Skulle kopiere det nye bllede over i temp filen
$file2 = addslashes(fread(fopen($file2,"rb"),filesize($file2)));
$sql = "INSERT INTO pix SET file='$file', thumbnail='$file2', type='$type', text='test billede', height='$height', width='$width', height2='$new_height', width2='$new_width'";
sql_connect();
sql_query($sql);
sql_close();
header("Location:read.php");

Her får jeg så bare denne fejl:
parse error, unexpected T_STRING in save.php on line 20
linie 20 er: Imagejpeg($dst_img, $tmpfname);

"/tmp" i nedenstående linie betyder bilioteket 'tmp' i det jeg står i ik ?
$tmpfname = tempnam("/tmp", "tempfil");
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 21:12 #26
ups... denne linie skulle jo nok være:
$file2 = addslashes(fread(fopen($temfname,"rb"),filesize($temfname)));
Avatar billede nexus-6 Nybegynder
01. marts 2003 - 21:13 #27
ups.. ups $temfname skal være $tmpfname
:)
Avatar billede nexus-6 Nybegynder
15. september 2004 - 14:28 #28
lukker
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