Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Php kuvanlisäys

Sebu [08.10.2009 14:04:44]

#

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>';

	}
}


?>

vph81 [08.10.2009 19:07:50]

#

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ä?

Short Php [08.10.2009 19:10:25]

#

http://www.radinks.com/upload/config.php

vph81 [08.10.2009 20:03:49]

#

..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. :-(

Metabolix [08.10.2009 20:39:42]

#

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!");
}

vph81 [08.10.2009 21:47:51]

#

Ok, Sori, pidetään mielessä!!
Häivyn häiriköimästä..

ps. Kuva mene type iffien läpi, eli ei vika siinä..

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta