Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Upload (monta tiedostoa samaan aikaan)

Sahrah [21.10.2008 04:29:31]

#

Yksinkertainen upload, jolla voidaan lähettää monta tiedostoa samaan aikaan. Ei ulkonäöllä pilattu.

Jos lähetetään yksi tiedosto, tulee se suoraan tiedostojen kohdekansioon. Jos taas lähetetään monta tiedostoa tehään niille oma kansio johon ne laitetaan.

Irkissä varsinkin kätevä jos halutaa vaikka uppia muutama kuva jostakin jutusta nopeasti muiden nähtäville :)

Tässä varmaan on vielä parannettavaa joissakin kohtiin. Palautetta otetaan vastaan :)

EDIT: Jos ei suostu suuret tiedostot menemään, muuttakaa suoraan php.inistä nuo suuremmaksi. ini_set toimii miten sattuu

<?php
ini_set('upload_max_filesize', '128M'); //Isoja tiedostoja täytyy upppia
//ini_set('default_socket_timeout', '1');
//ini_set('max_input_time', '1');
ini_set('memory_limit', '256M');  //En tiedä viekö muistia mutta sekin on nyt varmuuden vuoksi
ini_set('post_max_size', '128M');    //Tämä myös rajoittaa upittavaa tiedoston kokoa
set_time_limit(0);   //Aikaraja pois, uppimisessa saattaa kestää
// Nuo ei tietenkään luonnollisesti toimi safemodessa

$upload_maara = 20;  //Montako tiedostoa voidaan uppia kerallaan
$upload_kansio = '.'; //Kansio mihin upitaan scriptin näkökulmasta. Voidaan myös laittaa absoluuttinen polku
$vittu = "http://".$_SERVER['SERVER_NAME']."/jakokansio";  //Serverin tiedot, että osoitteet tulee OK

function arvo_kansio() {
	$kirjaimet = NULL;
	for ($i = 0; $i < 6; $i++) {
		$kirjaimet = "$kirjaimet".chr(rand(97, 122));
	}
	return $kirjaimet;
}

if (isset($_POST['lahetys'])) {  //Tiedostojen vastaanotto alkaa tästä

	$lahetettyjen_maara = 0;
	$yhteensa_lisatty = 0;

	for ($i = 0; $i < $upload_maara; $i++) {  //Lasketaan montako tiedostoa on upittu
		if ($_FILES[$i]['name'] != NULL) {
			$lahetettyjen_maara++;
		}
	}

	if ($lahetettyjen_maara > 1) {   //Jos on upittu yli 1 tiedosto, tehdään kansiotoimenpiteet
		do {
			$kansio = arvo_kansio();
		} while (is_dir("$upload_kansio/$kansio")); //Arvotaan kansiolle nimi ja pyöräytetään arpa niin monta kertaa että löytyy kansio jota ei vielä ole

		mkdir("$upload_kansio/$kansio");
		chmod("$upload_kansio/$kansio", 0777);
	}
	elseif ($lahetettyjen_maara == 0) { //Jos ei yhtään, läjäytetää virheet
		echo "<span style=\"color: red;\">Yrititkö edes lähettää yhtään tiedostoa? :O:O:O:PO</span>vittu\n";
		exit;
	}

	for ($i = 0; $i <= $upload_maara; $i++) {  //Vastaanottosilmukka
		$nimi = $_FILES[$i]['name'];
		$nimi = preg_replace('/(.{0,})(\.php|cgi$)/i', "$1", $nimi);  //Pahat tiedostot pois, nekin kyllä menee läpi mutta tiedostopääte poistetaan

		if ($lahetettyjen_maara == 1 && $_FILES[$i]['name'] != NULL) { //Jos lähetettyjä tiedostoja on vain yksi
			if (file_exists("$upload_kansio/$nimi")) { //Jos sattumalta on saman niminen tiedosto jo olemassa, ei korvata sitä vaan laitetaa sen etee satunaisia kirjaimia
				$nimi = arvo_kansio().$nimi;
			}
			if (move_uploaded_file($_FILES[$i]['tmp_name'], "$upload_kansio/$nimi")) { //Jos uppiminen onnistuu tehään sivu ja lopetetaan skripti
				echo "<p style=\"font-size: 35px;\"><a href=\"$vittu/".rawurlencode($nimi)."\">$vittu/$nimi</a></p>\n";
				echo "<p><input type=\"text\" name=\"asdf\" size=\"170\" value=\"$vittu/".rawurlencode($nimi)."\" /></p>\n";
				echo "Tiedoston $nimi siirtaminen onnistui!";
				exit;
			}
			else { //Jos ei jostain syystä onnistu
				@unlink($_FILES[$i]['tmp_name']); //Poistetaan temistäkin mokoma jos se siellä on
				echo "<span style=\"color: red;\">Tiedoston $nimi lahettaminen ei onnistunut jostakin syysta</span>\n";
				exit; //lopetetaan
			}
		}
		if ($_FILES[$i]['name'] == NULL) { //Jos uppija ei ole laittanu järjestyksessä tiedostoja hypätään seuraavaan
			continue;
		}

		if (move_uploaded_file($_FILES[$i]['tmp_name'], "$upload_kansio/$kansio/$nimi")) { //Muuten siirretään tiedosto arvottuun hakemistoon
			echo "Tiedoston $i, $nimi lähetys onnistui!<br />\n";
			$yhteensa_lisatty++;
		}
		else { //Ja jos sen siirto ei jostain syystä onnistu, poistetaan se tempistäkin jos se sinne on jäänny ja laitetaan virheilmotukset
			@unlink($_FILES[$i]['tmp_name']);
			echo "<span style=\"color: red;\">Tiedosto $nimi lähetettiin, mutta sen vastaanottamisessa ilmeni ongelmia</span><br />\n";
		}
	}
	//Tässä vaiheessa on kaikki teodostot siirretty, laitetaan ilmotukset ja linkki kansioon mistä ne löytyy.
	echo "<h1>Yhteensä $yhteensa_lisatty tiedostoa lisätty</h1>\n";
	echo "<h3>Tiedostot ovat kansiossa:</h3>\n";
	echo "<p style=\"font-size: 35px;\"><a href=\"$vittu/$kansio/\">$vittu/$kansio/</a></p>\n";
}
else { //Jos tullaan sivulle, ei olla painettu lähetä - nappulaa:
?>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">

<?php

for ($i = 0; $i < $upload_maara; $i++) { //Tämä pyörähtää niin monta kertaa kun $upload_maara sallii
	echo "<input type=\"file\" name=\"$i\" size=\"60\" /><br />\n";
}
?>

<p><input type="submit" name="lahetys" value="Lähetä tiedostot" /></p>

</form>
<?php } ?>

Vastaus

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

Tietoa sivustosta