Gå til innhold

Får ikke satt maks filstørrelse på opplastingsskript


Anbefalte innlegg

Heisann,

 

Sitter her og prøver å lære meg lett php i ferien. Har kommer til PHP File Upload-delen, og holder på å lage et opplastingsskript. Alt funker som det skal, bortsett fra at limiten jeg har satt på 20kb ikke virker.

 

index.php

<form action="upload.php" method="post"
enctype="multipart/form-data">
<label for="file"><b>Filnavn:</b></label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

 

upload.php

<?php
if (($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
&& ($_FILES["file"]["size"] < 20000))
 {
 if ($_FILES["file"]["error"] > 0)
   {
   echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
   }
 else
   {
   echo "<b>Filnavn:</b> " . $_FILES["file"]["name"] . "<br />";
   echo "<b>Filtype:</b> " . $_FILES["file"]["type"] . "<br />";
   echo "<b>Størrelse:</b> " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";

   if (file_exists("upload/" . $_FILES["file"]["name"]))
     {
     echo "<b>Feilmelding!</b> Filen " . $_FILES["file"]["name"] . " finnes allerede. ";
     }
   else
     {
     move_uploaded_file($_FILES["file"]["tmp_name"],
     "upload/" . $_FILES["file"]["name"]);
     echo "<b>Filen din ligger nå her:</b> " . "upload/" . $_FILES["file"]["name"];
     }
   }
 }
else
 {
 echo "Feil filformat. Du kan kun laste opp .gif og .jpeg-filer";
 }
?>

 

 

Noen som vet hva jeg gjør feil her? Har prøvd å google litt, og leste noe om at man måtte konfiguere noe i php.ini? Noen som eventuelt kan forklare det litt nærmere?

Lenke til kommentar
Videoannonse
Annonse

vet ikke. php krever parameteren MAX_FILE_SIZE ved filopplasting. den kan man styre fra klient siden dersom man vet hvordan. men du har en sjekk i scriptet ditt som er verre å komme seg forbi. en annen ting er php.ini. der kan du også sette en grense for størrelsen på opplastede filer.

 

edit: det er forresten ganske lett å sjekke om noen har gjort noe med verdien.

 

if(strcmp($_POST['MAX_FILE_SIZE'], '20000')) die('Ikke prøv deg!');

 

btw: strcmp returnerer 0 hvis filene er like. ellers returnerer den et tall som indikerer forskjellen på stengene.

Endret av grimjoey
Lenke til kommentar

Ikke så farlig alikevel da. :)

 

Men driver og ser på thumbnail preview nå, og får det liksom ikke til å stemme helt. Mitt script er bygd opp på en litt annen måte enn de jeg kommer over på nettet, slik som det på denne siden. Jeg prøver å få implementert det, men skjønner bare ikke hvordan jeg skal få dem sammen. Men så er jo jeg nybegynner, hehe.

 

Prøvde å gå etter det upload-scriptet de hadde laget, og legge til thumbnail-funksjonen på den, men der er det også noe som ikke helt stemmer. Har selv modifisert det slik jeg "tror" de skal være.

 

 

 

form

<FORM ENCTYPE="multipart/form-data" ACTION="thumbnail.php" METHOD=POST>
Last opp et bilde: <INPUT NAME="userfile" TYPE="file">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<INPUT TYPE="submit" VALUE="Last opp"></FORM> 

 

 

thumbnail.php

<?php

if ($userfile_size >2000000){$msg=$msg."Filen du lastet opp er på mer enn 2mb, så vennlig reduser filstørrelsen.";
$file_upload="false";}

if (!($userfile_type =="image/pjpeg" OR $userfile_type=="image/gif")){$msg=$msg."Filen du lastet opp er en filtype som ikke er tillatt. Du kan bare laste opp .gif og .jpg-filer.";
$file_upload="false";}

$add="upload/$userfile_name"; // the path with the file name where the file will be stored, upload is the directory name.
if(move_uploaded_file ($userfile, $add)){
echo "Opplastingen av bildet var vellykket!";
chmod("$add",0777);
}else{echo "Det skjedde en feil under opplastingen. Vennligst kontakt ansvarlig.";
exit;}

///////// Start the thumbnail generation//////////////
$n_width=100; // Fix the width of the thumb nail images
$n_height=100; // Fix the height of the thumb nail imaage
$tsrc="upload/$userfile_name"; // Path where thumb nail image will be stored

if (!($userfile_type =="image/pjpeg" OR $userfile_type=="image/gif")){echo "Filen du lastet opp er en filtype som ikke er tillatt. Du kan bare laste opp .gif og .jpg-filer.";
exit;}

/////////////////////////////////////////////// Starting of GIF thumb nail creation///////////
if (@$userfile_type=="image/gif"){
$im=ImageCreateFromGIF($add);
$width=ImageSx($im);              // Original picture width is stored
$height=ImageSy($im);            // Original picture height is stored
$newimage=imagecreatetruecolor($n_width,$n_height);
imageCopyResized($newimage,$im,0,0,0,0,$n_width,$n_height,$width,$height);

if (function_exists("imagegif")) {
Header("Content-type: image/gif");
ImageGIF($newimage,$tsrc);
}
elseif (function_exists("imagejpeg")) {
Header("Content-type: image/jpeg");
ImageJPEG($newimage,$tsrc);
}

chmod("$tsrc",0777);

////////////// starting of JPG thumb nail creation//////////
if($userfile_type=="image/pjpeg"){
$im=ImageCreateFromJPEG($add);
$width=ImageSx($im); // Original picture width is stored
$height=ImageSy($im); // Original picture height is stored
$newimage=imagecreatetruecolor($n_width,$n_height);
imageCopyResized($newimage,$im,0,0,0,0,$n_width,$n_height,$width,$height);
ImageJpeg($newimage,$tsrc);
chmod("$tsrc",0777);
}
//////////////// End of JPG thumb nail creation //////////

?>

Lenke til kommentar

hva er det du får? en blank side? prøv å sette error_reporting('E_ALL'); i starten av filen for notice og warning feil.

 

du har image/pjpeg et par steder. lurer på om dette skal være image/jpeg.

 

prinsippet er at du lager en bilde ressurs med $img_thumb = imagecreatetruecolor(høyde, bredde); i ønsket størrelse. så henter du orginal bilde med $img_orig = imagecreatefromjpeg(filnavn); og gjør en imagecopyresized($img_orig, $img_thumb, 0, 0, orig_høyde, orig_bredde, 0, 0, thumb_høyde, thumb_bredde).

 

nå kan du enten vise bildet:

 

header('Content-type: image/jpeg');

imagejpeg($img_thumb);

 

eller lagre det:

 

ob_start();

imagejpeg($img_thumb);

$image = ob_get_contents();

ob_end_clean();

file_put_contents(filnavn, $image);

 

edit: du bør ha et par switch statements på filendelsen så du får lastet opp gif, jpeg og png.

 

$filendelse = array_pop(explode('.', basename($filnavn)));

switch($filendelse) {

case 'jpeg':

case 'jpg':

$img_orig = imagecreatefromjpeg($filnavn);

break;

case 'gif':

$img_orig = imagecreatefromgif($filnavn);

break;

case 'png':

$img_orig = imagecreatefrompng($filnavn);

}

 

samme med output (imagegif(); imagejpeg(); imagepng();)

Endret av grimjoey
Lenke til kommentar

Jeg prøvde å sette inn Error_reporting, men det kommer fortsatt bare en blank side. Har vært så vidt innom switch, og skal se litt nærmere på det.

 

Har nå prøvd å laste ned scriptet, men det også uten hell. Får beskjeden "Failed to upload file Contact Site admin to fix the problem", som kommer fra:

 

$add="upimg/$userfile_name"; // the path with the file name where the file will be stored, upload is the directory name. 
if(move_uploaded_file ($userfile, $add)){
echo "Successfully uploaded the mage";
chmod("$add",0777);

}else{echo "Failed to upload file Contact Site admin to fix the problem";
exit;}

 

Det tyder vel på at bilder rett og slett ikke blir lastet opp?

 

Edit: har selvfølgelig satt CHMOD til 777.

Endret av Brød
Lenke til kommentar

du kan også sette chmod +t. chmod 777 gir read write og execute tilgang til alle på hosten. men det betyr også at de kan slette. chmod +t gjør at ingenting kan slettes. mulig det må skrives chmod a+t.

 

sjekk variablene som omhandler filflyttingen med echo. sjekk at det stemmer med dir-strukturen din.

 

under en filopplasting lagres filen i tmp banen på serveren. $_FILES['userfile']['tmp_name']. sjekk om den eksisterer før du prøver å flytte. ellers generer feilmelding. du kan også se på $_FILES['userfile']['error'] som gir et tall dersom det har skjedd noe feil. ellers 0 dersom alt er i orden. tallene kan sjekkes mot en tabell hos php.net for å se hva feilen er.

Lenke til kommentar

Takk for at du gidder :)

 

Skal jeg forandre CHMOD her du mener?

$add="upimg/$userfile_name"; // the path with the file name where the file will be stored, upload is the directory name. 
if(move_uploaded_file ($userfile, $add)){
echo "Successfully uploaded the image";
[b]chmod a+t("$add",0777);[/b]

}else{echo "Failed to upload file Contact Site admin to fix the problem";
exit;}

Det fungerer jo fint å laste opp på det scriptet som ikke skal ha thumbnails, så tror egentlig ikke det skal være et problem.

 

Alle mappene "thimg" og "upimg" ligger på serveren.

 

Kan du gi meg en link til den tabellen?

Lenke til kommentar
<?php
if (($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
&& ($_FILES["file"]["size"] < 20000))

Feilen her er at størrelsen bare blir sjekket hvis type er "image/pjpeg".

Oversatt til norsk blir det omtrent:

type er lik "image/gif", type er lik "image/jpeg", eller type er lik "image/pjpeg" og size er mindre enn 20000.

Dette kan løses ved å bruke parenteser:

if (($_FILES["file"]["type"] == 'image/gif' || $_FILES["file"]["type"] == 'image/jpeg' || $_FILES["file"]["type"] == 'image/pjpeg') && $_FILES["file"]["size"] < 20000)

Du kan også bruke in_array():

if (in_array($_FILES["file"]["type"], array('image/gif', 'image/jpeg', 'image/pjpeg') && $_FILES["file"]["size"] < 20000)

 

Grimjoey: Det er unødvendig å bruke output buffering, imagepng o.l. tar en valgfri andre parameter, som er filnavn bildet blir lagret til.

 

Brød: Slutt å ha apostrofer rundt variabler. (chmod("$add", 0777); -> chmod($add, 0777);). Du skal bare bruke apostrofer til stringer (f.eks. "Hallo, Verden!") og eventuelt når du skal sette inn variabler i en string (f.eks "Hallo, {$username}, du besøkte sist siden {$lastvisit}.").

 

Beklager hvis jeg virker litt sur.

Lenke til kommentar

Beklager, det siste scriptet er ikke av meg en gang. :) Men er du sikker på at du ikke blander litt nå? Det første upload-scriptet uten thumbnail-preview (som du quoter med på) er jeg ferdig med og den fungerer nå fint. Nå sitter jeg og prøver å få til et annet script med thumbnail-preview. Det er ikke noe i veien å bygge videre på det første, men slik som det andre scriptet er oppbygd, føler jeg det er lettere å jobbe med.

Lenke til kommentar

Ok, var litt usikker på on det.

 

Her er den jeg bruker til å lage thumbnails:

<?php
/*
 * Thumbnail script
 * 
 * Copyright ITSBTH 2007
 * 
 * Usage: thumb.php?img=path/to/image.ext
 */

// Configuration vars
$folder = 'thumb/'; // Must exists and be writable
$max = 100; // Maximum width/height of the image, in pixels
// End of configuration vars, edit below at your risk

   if(!isset($_GET['img']) || !file_exists($_GET['img']))
	exit();
$fname = $folder . array_pop(explode('/', $_GET['img']));
$imgtype = substr($_GET['img'], -3);
if($imgtype == 'jpg') $imgtype = 'jpeg';
header("Content-Type: image/{$imgtype}");
if(file_exists($fname)){
	fpassthru(fopen($fname, 'r'));
	exit();
}

switch($imgtype){
	case 'jpeg':
		$img = imagecreatefromjpeg($_GET['img']);
	break;
	case 'png':
		$img = imagecreatefrompng($_GET['img']);
	break;
	case 'gif':
		$img = imagecreatefromgif($_GET['img']);
	break;
}

list($width, $height) = getimagesize($_GET['img']);
$ratio = (max($width, $height) > $max ? $max / max($width, $height) : 1);
$modwidth = $width * $ratio;
$modheight = $height * $ratio;
$tn = imagecreatetruecolor($modwidth, $modheight);
imagecopyresampled($tn, $img, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);
imagedestroy($img);
switch($imgtype){
	case 'jpeg':
		imagejpeg($tn, $fname);
		imagejpeg($tn);
	break;
	case 'png':
		imagepng($tn, $fname);
		imagepng($tn);
	break;
	case 'gif':
		imagegif($tn, $fname);
		imagegif($tn);
	break;
}
imagedestroy($tn);

?>

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...