Löysin netistä alla olevan skriptin ja otin sen käyttöön erään sivuston sisällönhallinnassa. Systeemi toimii niin kuin pitääkin, paitsi silloin kun ladattavan kuvan tiedostokoko ylittää 2MB tai kuvakoko on yli 5000px.
Onko syy koodissa vai pitääkö tutkia palvelimen php-asetuksia ja jos syy on siellä niin pysyykö niitä kiertää jotenkin. Kiitos vastauksista.
<?php ini_set("memory_limit", "800000000"); // for large images so that we do not get "Allowed memory exhausted"?> <?php // upload the file if ((isset($_POST["submitted_form"])) && ($_POST["submitted_form"] == "image_upload_form")) { // file needs to be jpg,gif,bmp,x-png if (($_FILES["image_upload_box"]["type"] == "image/jpeg" || $_FILES["image_upload_box"]["type"] == "image/pjpeg" || $_FILES["image_upload_box"]["type"] == "image/gif" || $_FILES["image_upload_box"]["type"] == "image/x-png") && ($_FILES["image_upload_box"]["size"] < 8000000)) { // some settings $max_upload_width = 80000; $max_upload_height = 60000; // if user chosed properly then scale down the image according to user preferances if(isset($_REQUEST['max_width_box']) and $_REQUEST['max_width_box']!='' and $_REQUEST['max_width_box']<=$max_upload_width){ $max_upload_width = $_REQUEST['max_width_box']; } if(isset($_REQUEST['max_height_box']) and $_REQUEST['max_height_box']!='' and $_REQUEST['max_height_box']<=$max_upload_height){ $max_upload_height = $_REQUEST['max_height_box']; } // if uploaded image was JPG/JPEG if($_FILES["image_upload_box"]["type"] == "image/jpeg" || $_FILES["image_upload_box"]["type"] == "image/pjpeg"){ $image_source = imagecreatefromjpeg($_FILES["image_upload_box"]["tmp_name"]); } // if uploaded image was GIF if($_FILES["image_upload_box"]["type"] == "image/gif"){ $image_source = imagecreatefromgif($_FILES["image_upload_box"]["tmp_name"]); } // BMP doesn't seem to be supported so remove it form above image type test (reject bmps) // if uploaded image was BMP if($_FILES["image_upload_box"]["type"] == "image/bmp"){ $image_source = imagecreatefromwbmp($_FILES["image_upload_box"]["tmp_name"]); } // if uploaded image was PNG if($_FILES["image_upload_box"]["type"] == "image/x-png"){ $image_source = imagecreatefrompng($_FILES["image_upload_box"]["tmp_name"]); } $remote_file = "../image_upload/".$_FILES["image_upload_box"]["name"]; imagejpeg($image_source,$remote_file,100); chmod($remote_file,0644); // get width and height of original image list($image_width, $image_height) = getimagesize($remote_file); if($image_width>$max_upload_width || $image_height >$max_upload_height){ $proportions = $image_width/$image_height; if($image_width>$image_height){ $new_width = $max_upload_width; $new_height = round($max_upload_width/$proportions); } else{ $new_height = $max_upload_height; $new_width = round($max_upload_height*$proportions); } $new_image = imagecreatetruecolor($new_width , $new_height); $image_source = imagecreatefromjpeg($remote_file); imagecopyresampled($new_image, $image_source, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height); imagejpeg($new_image,$remote_file,100); imagedestroy($new_image); } imagedestroy($image_source); $new_name = date("ymdHis"); rename($remote_file, "../image_upload/" . $new_name . ".jpg"); //lykätään myös tietokantaan kuvan nimi $target_id = $_POST['target_id']; $image_text = $_POST['image_text']; if (!$query_upload_image = mysql_query("INSERT INTO image_uploads (name,page,target_id,image_text) VALUES ('$new_name', '$page','$target_id','$image_text')",$yhteys)) { $viesti = mysql_error(); } else { $viesti = 'Kuvan lisääminen onnistui.'; } echo '<h2>Kuva lisätty</h2>'; } else{ echo '<h2>kuvan lisäys epäonnistui</h2>'; } } ?>
Menee nyt vähän ohi kysymyksen, mutta itselläni vähän samantapainen koodi (todella paljon pelkistettynä), ja vastaan potkii jokin ihan muu kuin kuvan koko.
Digikameralla otetut 5Mpix kuvat kelpaavat, samoin esim windowsin "sample pictures", mutta sitten kännykällä otettu 640x480 kuva ei enää kelpaakkaan.
Kokeilin tallentaa nimellä kelpaamattoman kuvan photoshopilla muuttamatta mitään
ja kas kummaa, rupesi kelpaamaan. Sillä valiseeko photoshopista parhaan vai heikoimman laadun ei ollut mitään vaikutusta, tallentamisen jälkeen aina kelpasi.
Tiedosto päätteetkin ovat kaikissa samat eli .jpg .
Todella ihme juttu..ei oikein voi jokaista nettipalvelun käyttäjääkään velvoittaa tallentelemaan kuviaan photoshopilla. Olisiko kenties joku perillä tästä?
..jub jub, 48,8KB kuvalla ei toimi ja 702KB kuvalla toimii.
Ja 46,9KB kuvalla taas pelaa joten koko ei ilmeisesti
minun tapauksessani ole ratkaisevaa.
Raivostuttavaa. :-(
Edit. Vastasinkin väärälle henkilölle. Jatkossa vph81 voisi tehdä omille kysymyksilleen omat aiheet, kun kyseessä on aivan eri ongelma.
Sebu: Luultavasti syynä on PHP:n asetuksissa säädetty lähetettävän tiedoston maksimikoko.
(Seuraavan vastauksen kirjoitin vph81:n kysymykseen mutta Sebun koodin perusteella. Neuvo on siitä huolimatta pätevä myös Sebun koodiin.) Ota alusta tuo pitkä type-iffi pois, ja kuvan avauksessakin tarkista vain, että kuvan saa edes jotenkin auki. Selain ei välttämättä lähetä oikeaa tyyppiä, ja hakkeri voi joka tapauksessa valehdella sen.
<?php $image_source = $_FILES["image_upload_box"]["tmp_name"]; $image_source = file_get_contents($image_source); $image_source = imagecreatefromstring($image_source); if (!$image_source) { die("Bad file format!"); }
Ok, Sori, pidetään mielessä!!
Häivyn häiriköimästä..
ps. Kuva mene type iffien läpi, eli ei vika siinä..
Aihe on jo aika vanha, joten et voi enää vastata siihen.