Multiple file upload

raspi 31.10.03 11:08

Tällä voi uppia useampia tiedostoja

 Tekstiversio  Arvo: -1 (7 ääntä)  Äänestä: +  -
<?php
// raspi 2003
// formi, jolla voi lähettää monta tiedostoa kerrallaan
// testattu mozilla firebirdillä

if(isset($_GET['ss'])) {show_source($_SERVER['SCRIPT_FILENAME']); die();}
define("KIRJOITA_YLI", 0); // näitä ei saa vaihtaa
define("UUDELLEENNIMEA", 1);
/* konffi alkaa: */
$moodi = UUDELLEENNIMEA; // mitä tehdään jos upload-hakemistossa on jo saman niminen tiedosto
$tiedostokoko = "5 KB"; // n MB/KB/B
$kommentti = "Lähetä tämä tiedosto: ";
$laheta = "Lähetä"; // submit-painike
$tuetutpaatteet = "Tuetut tiedostopäätteet: ";

$uploadtmp = './tmp/'; // huom, ei toimi välttämättä.
$uploaddest = './upped/'; // hakemisto minne upatut tiedostot siirretään

$logtransfer = 1; // kirjoitetaanko logitiedostoon et kuka lähetti mitäkin
// huom: sinun pitää itse luoda tämä tiedosto ja antaa sille kaikki oikeudet (666 tai 777)
// % touch UPLOADLOG.txt
// % chmod a+rwx UPLOADLOG.txt
$logfilename = "UPLOADLOG.txt";

$usemime = 1; // katsotaanko mime-tyyppi? (käyttää serverin omia mimetyyppejä)
$acceptedmimes = array( // tuetut mime-tyypit mitä saa lähettää
  "text/html", "text/plain", "image/jpeg", "image/png"
);

$acceptedext = array( // sallitut tiedostopäätteet
  "txt", "jpg", "jpeg", "png", "gif"
);

$etuliite = "tiedosto"; // formissa käytettävä etuliite
$oikat = '0777'; // 7=rwx

$palvelimen_portti = 80;
/* konffi loppu */
function getmimetype($addr, $port, $wah) {
  $sock = fsockopen($addr, $port);
  if(is_resource($sock)) {
    fputs($sock, "HEAD $wah HTTP/1.1\r\n");
    fputs($sock, "Host: $addr\r\n");
    fputs($sock, "\r\n");
    $head = null;
    $line = null;
    while(!feof($sock) && $line != "\r\n") {
      $line = fgets($sock);
      if(preg_match("/^Content\-Type: (\w+\/\w+)/i", $line, $get)) $match=$get[1];
    }
  }
  fclose($sock);
  if(isset($match)) return trim(strtolower($match)); else return -1;
} // func

if(!is_dir($uploadtmp) || !is_dir($uploaddest))
die("err: hakemistoa \"$uploaddest\" tai \"$uploadtmp\" ei ole!\n");

if(!is_writable($uploadtmp) || !is_writable($uploaddest))
die("err: hakemistoon \"$uploaddest\" tai \"$uploadtmp\" ei voi kirjoittaa\n");

@ini_set('upload_temp_dir', $uploadtmp); // ei mee välttämättä läpi
$maxsize = $tiedostokoko;
list($tiedostokoko, $tiedostoyksikko) = explode(" ", $tiedostokoko);
if($tiedostokoko <= 0) die("Isompi tiedostokoko PLZ");
if($tiedostoyksikko == "KB") $tiedostokoko *= 1024;
if($tiedostoyksikko == "MB") $tiedostokoko *= 1024 * 1024;

if(isset($_POST) && !empty($_POST)) {
  if(!isset($_POST['MAX_FILE_SIZE'])) die('wtf?');
  if(isset($_FILES[$etuliite]) && !empty($_FILES[$etuliite])) {
    // käydään tiedostopäätteet läpi
    $accepted = array();
    foreach($_FILES[$etuliite]['name'] as $var => $val) {
      $fname = $val;
      $finfo = pathinfo($val);
      $val = $finfo['extension'];
      for($i = 0; $i <= count($acceptedmimes)-1; $i++) {
        if(!isset($accepted[$fname])) $accepted[$fname] = 0;
        if(strtolower($val) == strtolower($acceptedext[$i]) && $accepted[$fname] == 0)
        $accepted[$fname] = 1;
      }
    }
    $badfiles = null;
    foreach($accepted as $fname => $checked)
    if(!$checked) {
      unset($accepted[$fname]);
      $badfiles .= '"' . $fname . '" ';
    }
    if(count($accepted) != count($_FILES[$etuliite]['name']))
    die("EXT: (" . trim($badfiles) . ") NO BONUS!");

    // tiedoston koot..
    $accepted = 0; $badfiles = null;
    foreach($_FILES[$etuliite]['tmp_name'] as $var => $val) {
      if(filesize($val) > 0 && filesize($val) <= $tiedostokoko)
      $accepted++; else $badfiles .= '"' . $_FILES[$etuliite]['name'][$var] . '" ';
    }
    if($accepted != count($_FILES[$etuliite]['tmp_name'])) die("FILESIZE: ($badfiles) NO BONUS!");
   
    // kaikki upattu OK?
    $accepted=0;
    foreach($_FILES[$etuliite]['error'] as $var => $val) {
      if($val == 0) $accepted++;
    }
    if($accepted != count($_FILES[$etuliite]['error'])) die("FILE(S) NOT UPLOADED 100%! TRY AGAIN!");

    // vihdoinkin itse toimitus
    foreach($_FILES[$etuliite]['name'] as $var => $val) {
      if($val{0} == '.') die("eh?"); // ei piilotettuja
      if(false == strpos($val, '.')) die('hm?'); // ei ilman pistettä
      if(file_exists($uploaddest . basename($val)) && $moodi == UUDELLEENNIMEA) {
          $uus = time() ."_$val";
          // jos unixtimestampilla oli jo file niin käytetään sitten microtimeä :)
          if(file_exists($uploaddest . basename($uus))) {
            $uus = microtime() . "_$val";
          }
        $val = $uus;
      }
     
      // karsitaan turhat merkit pois tiedostonimestä
      $val = preg_replace("/[^äöå\w\d\-\ \(\)\[\]\&\%\+\?\!\.\=\,_\^\$\~\'\"\}\{\*\:\;\<\>\|\`]/i", "", $val);
      $tied = $uploaddest . trim(strtolower(basename($val)));

      if (move_uploaded_file($_FILES[$etuliite]['tmp_name'][$var], $tied)) {
        chmod($tied, 0777);// chmodataan kaikki oikat

        if($usemime == 1) { // tarkistetaan MIME-tyyppi
          $mime = getmimetype($_SERVER['HTTP_HOST'], $palvelimen_portti, $tied);
          $accepted = 0;
          for($i = 0; $i <= count($acceptedmimes)-1; $i++) {
            if($mime == strtolower($acceptedmimes[$i])) $accepted++;
          }
          if($accepted == 0) {
            unlink($tied);
            die("MIME: NO BONUS! $tied ($mime)");
          }
        } // mime=1

        chgrp($tied, filegroup($_SERVER['SCRIPT_FILENAME'])); // muutetaan sama grouppi
        // muutetaan sama owneri (tämä ei yleensä toimi, koska PHP:tä ajaa yleensä "www" tms käyttäjällä)
        @chown($tied, fileowner($_SERVER['SCRIPT_FILENAME'])); // mutta aina voi yrittää..
        chmod($tied, octdec($oikat)); // chmodataan kaikki oikat käyttäjän haluamiks

        // logifile
        if($logtransfer && file_exists($logfilename) && is_writable($logfilename)) {

          if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $IP=$_SERVER["HTTP_X_FORWARDED_FOR"];
            $proxy=$_SERVER["REMOTE_ADDR"];
          }
          elseif(isset($_SERVER["HTTP_CLIENT_IP"])) $IP=$_SERVER["HTTP_CLIENT_IP"];
          else $IP=$_SERVER["REMOTE_ADDR"];

          if($IP == 'unknown') $IP = $proxy;
          $hosti = @gethostbyaddr($IP);
          $portti = $_SERVER['REMOTE_PORT'];
          $brow = $_SERVER['HTTP_USER_AGENT'];
          $fp = fopen($logfilename, 'a');
          $rivi = date("d.m.Y H:i:s") . "\t" . basename($tied) . "\t$hosti ($IP:$portti)\t$brow";
          fputs($fp, $rivi . "\n");
          fclose($fp);
        }

      } else {
        die("ERROR!");
      }
    } // foreach

    header("Location: {$_SERVER['PHP_SELF']}?ok"); // uudelleenohjaus
    die();

  } else {
    /* mitään ei upattu */
    echo "et sitten upannu mitään!";
  } // else
  die();
}

if(isset($_GET['ok'])) {
  echo "Tiedosto(t) lähetetty onnistuneesti! <a href=\"$uploaddest\">Selaa</a>.<br />\n";
  // die();
}

$paatelista = null;
foreach($acceptedext as $paate) $paatelista .= "*.$paate, ";
$paatelista = substr($paatelista, 0, -2);

// formi:
echo "<form enctype=\"multipart/form-data\" action=\"{$_SERVER['PHP_SELF']}\" method=\"POST\">\n";
echo "  <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"$tiedostokoko\">\n";
echo "  $tuetutpaatteet $paatelista <br />\n";
echo "  $kommentti [MAX: $maxsize ($tiedostokoko B)]<br />\n";
echo "  <input name=\"{$etuliite}[tied1]\" type=\"file\" /><br />\n"; // oleellinen: [tied1]
echo "  <input name=\"{$etuliite}[tied2]\" type=\"file\" /><br />\n"; // oleellinen: [tied2]
//echo "  <input name=\"{$etuliite}[foobar]\" type=\"file\" /><br />\n"; // jne
//echo "  <input name=\"{$etuliite}[xyz]\" type=\"file\" /><br />\n"; // jne
echo "  <input type=\"submit\" value=\"$laheta\" />\n";
echo "</form>\n";
?>

lapponia 00:04 5.8.04 
@chown($tied, fileowner($_SERVER['SCRIPT_FILENAME'])); // mutta aina voi yrittää..

Turha laitella. Jos ei toimi ilman @-merkkiä, niin parasta poistaa koko rivi....
D4_B34M 20:47 18.3.05 
Hmm mulla pitäs kaikki asetukset olla ok.. ja kun yritän upata jotain noista sallituista tiedostoformateista niin tulee

EXT: ("") NO BONUS!

Uusin php löytyy asennetuna ja pitäs toimii kyllä...
sllz 11:49 19.7.05 
Mulle tuli sama juttu toi EXT no bonus homma
mylvari 18:23 22.12.05 
mulle tuli sama kuin noilla muilla mistä tämä johtuu?
katket 20:38 16.6.06 
Mitä jos ei tiedä kuinka monta tiedostoa haluaa upata? Jos laittaa tällä vain yhden niin tulee tuo ext no bonus. Gif-tiedostoja ei myöskään anna upata. Eli noita etuliite tied1 rivejähän voi lisätä mutta mitäs sitten kun haluaa upata vähemmän kun on rivejä?