Osaisikohan joku kertoa miksi ei onnistu .mp3 tiedoston upload formin kautta palvelimelle? Alla on demo.php tiedostosta se osa, joka siirtää formilta tulleen tiedoston demos/ hakemistoon.
<?php if (isset($_GET['action']) and trim($_GET['action']) == "send") { if (is_uploaded_file($_FILES['demofile']['tmp_name'])) { $cdata = explode("|", $_COOKIE[$COOKIE_LOGIN]); $uname = trim(strtolower(GetProfileData(trim($cdata[0]), "username"))); $type = $_FILES['demofile']['type']; // Tarkistetaan että tiedoston koko <= MAX_FILE_SIZE if (filesize($_FILES['demofile']['tmp_name']) > $_POST['MAX_FILE_SIZE']) { // "Tiedoston koko liian suuri" echo $txt[101]; ob_end_flush(); exit; } // Kaikki kunnossa copy($_FILES['demofile']['tmp_name'], $DIR_DEMOS . $uname . "_demo.mp3"); UpdateProfileSection($uname, "demofile", $uname . "_demo.mp3"); $_POST['demodetails'] = str_replace(chr(13) . chr(10), "<br>", $_POST['demodetails']); $_POST['demodetails'] = stripslashes($_POST['demodetails']); UpdateProfileSection($cdata[0], "demodetails", $_POST['demodetails']); echo ""; header("Location: index.php?page=demo&id=" . $cdata[0]); header("Location: index.php?page=myprofile&mode=edit"); ob_end_flush(); exit; } else { // "Mahdollinen tiedosto-hyökkäys tapahtunut" echo $txt[52] . " " . $_FILES['demofile']['name']; } } echo "<form enctype='multipart/form-data' action='index.php?page=demo&action=send' method='POST'>\n"; echo "<p>" . $txt[97] . "<br><input type='file' name='demofile'><br>" . $txt[39] . " " . $DEMO_SIZE . " " . $txt[100] . "( = " . ($DEMO_SIZE * 1024) . " " . $txt[40] . " )</p>\n"; echo "<p>" . $txt[98] . "<br><textarea name='demodetails' rows=3 cols=30>" . trim($demodetails) . "</textarea></p>\n"; echo "<p><input type='submit' value='" . $txt[99] . "'></p>\n"; echo "<input type='hidden' name='MAX_FILE_SIZE' value=" . ($DEMO_SIZE * 1024 * 1024) . ">\n"; echo "</form>\n"; ?>
$txt ovat vain sitten taulukossa olevia merkkijonoja. Koko homma pysähtyy tuohon toiseen if() lauseeseen joten jostain syystä tiedostoa ei tunnisteta "uploadatuksi" tiedostoksi.
Ongelma ei varmaan liity MP3-tiedostojen rakenteeseen, vaan niiden usein suureen kokoon. Kokeile, onnistuuko pienen MP3-tiedoston tai suuren kuvatiedoston kopioiminen. Ensinnäkin suurien tiedostojen kopiointi selaimen kautta kestää kauan, vaikka sen tekisi omalla palvelimella. Tämän lisäksi itselläni näytti olevan kopioitavan tiedoston maksimikoko oletuksena 2 megatavua PHP:n asetuksissa (php.ini, kohta upload_max_filesize).
Edellinen koodi on näköjään vähän huono ja turhia rivejä sisältävä, joten alla on uudempi ja pienemmässä koossa oleva skripti.
Eli tarkoitus olisi siirtää enintään 5 Mt suuri tiedosto lomakkeen kautta palvelimelle. Kuten Laaksonen sanoi, niin se maksimikoko siirretylle tiedostolle oli 2 Mt ja nyt skriptissä kys. asetus muutetaan 5 Mt:un hetkellisesti:
<?php ini_set("upload_max_filesize", "5M"); if (isset($_GET['action']) and trim($_GET['action']) == "send") { // Luetaan evästeestä tietoja $cdata = explode("|", $_COOKIE[$COOKIE_LOGIN]); // Haetaan käyttäjätunnus profiilista $uname = trim(strtolower(GetProfileData(trim($cdata[0]), "username"))); if (is_uploaded_file($_FILES['demofile']['tmp_name'])) { // $DIR_DEMOS osoittaa olemassa olevaan hakemistoon // johon tiedosto siirretään move_uploaded_file($_FILES['demofile']['tmp_name'], $DIR_DEMOS . $uname . "_demo.mp3"); $_POST['demodetails'] = str_replace(chr(13) . chr(10), "<br>", $_POST['demodetails']); $_POST['demodetails'] = stripslashes($_POST['demodetails']); // Päivitetään profiilitiedosto demon osalta UpdateProfileSection($uname, "demodetails", $_POST['demodetails']); UpdateProfileSection($uname, "demofile", $uname . "_demo.mp3"); header("Location: index.php?page=demo&id=" . $cdata[0]); } else { echo "Mahdollinen tiedostohyökkäys: " . $_FILES['demofile']['name']; } } $id = $_GET['id']; echo "<form enctype='multipart/form-data' action='index.php?page=demo&action=send' method='POST'>\n"; echo "<p>Tiedosto:<br><input type='file' name='demofile'></p>\n"; echo "<p>Kuvaus:<br><textarea name='demodetails' rows=3 cols=30></textarea></p>\n"; echo "<p><input type='submit' value='Lähetä'></p>\n"; echo "</form>\n"; ?>
(tiedoston kokoa ei tässä vielä tarkisteta). Kuitenkaan is_uploaded_file() ei toteudu vaan aina suoritetaan else -lauseke jostakin syystä mitä en nyt huomaa/keksi. Sama toistuu oli tiedoston koko mikä tahansa paitsi jos en siirrä .MP3 tiedostoa. Kuvat ym. tekstitiedostot menevät lomakkeen läpi ihan hyvin
Koita
<?php if (@is_uploaded_file($_FILES['demofile']['tmp_name'])) ?>
formista on unohtunut max_file_size, eli jonnekin form-tagien väliin:
<input type='hidden' name='MAX_FILE_SIZE' value='524880'>
Niin antaa lomakekin ladata alle 5 megatavun tiedostoja.
EDIT: acorn: @-operaattorihan nimenomaan estää kaikki virheilmoitukset, ei tuo niitä ilmi.
Ei tunnu toimivan tuo ini_set(), jos on safemode päällä.
Siihen on ratkaisu.
.htaccess-tiedostoon tulee lisätä
php_flag upload_max_filesize "5M"
TAI
php_value upload_max_filesize "5M"
Tuo jälkimmäinen toimii omassa php:ssäni, mutta ylempää on tyrkytetty mm. JPHP-sivuston oppaassa.
Ja jotta kaikki ymmärtäisivät, tuo "5M" on siis tiedoston maksimikoko megatavuissa.
Vaikutuksen näkee sitten php-ohjelmalla, jonka sisältö on
php_flag toimii ainoastaan on-off arvoissa, löysin tuon php_valuen vasta oppaan kirjoittamisen jälkeen.
Safe Modessa en aja skriptiä, mutta juuri huomasin erikoisen asian että php.ini tiedostoa ei ollut missään. Kopioin sitten php.ini-recommended tiedoston muokattuna Windows hakemistoon nimelle php.ini jossa upload_max_filesize on nyt asetettu 8 megatavuun. Nyt se näyttäisi toimivan ihan hyvin eli siirto tapahtuu onnistuneesti tuolla viimeisimmällä skriptillä sellaisenaan.
(käytössä oli PHP 4.2.3 ja Abyss X1 v1.1.4)
Aihe on jo aika vanha, joten et voi enää vastata siihen.