Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Filupaste (uploadaus)

sooda [07.01.2006 12:22:28]

#

15.02. päivitystä, korjasin bugin jossa samanniminen tiedosto ylikirjoittaisi toisen ja samalla lisäsin multipoiston. Tätä on muokittu niin monesti, että kertokaa ihmeessä jos teillä ei toimi.

örr, korjasin 8.1 11:20, ajalla oli väärä tyyppi tossa kannanluontihommassa.

Filupaste, eli pastebinin kaltainen härpäke johon pastetaan filuja. Fileestä varastoidaan hyödyllisiä tietoja ja ne on mahdollista nähdä ennen tiedoston lataamista, pastesivulla on linkki mistä fileen saa sitte napattua. Kuka tahansa voi pasteta. Aika helppo muuttaa koodista, itellä tämä vain on sivuilla käytössä hieman kustomoituna (http://sooda.dy.fi/fpaste/) ja tota koodia on pari kertaa kerjätty, en jaksanu kauheesti lähteä muuttelemaan.

Php:llä on hyvä olla kaikki oikeudet tuohon filehakemistoon, eli luo se ja huolehdi chmodeista! Hommeli käyttää mysliä. Kannan voi tehdä tälleen:

CREATE TABLE fpaste (
  nimi TEXT NOT NULL,
  mime TEXT NOT NULL,
  koko INT NOT NULL,
  aika DATETIME NOT NULL,
  id VARCHAR(32) NOT NULL,
  ip VARCHAR(15) NOT NULL,
  PRIMARY KEY (id)
);

Olettaa serverillä olevan magic_quotes_gpc:n päällä. Lisää tarvittavat addslashesit jos on tarpeen.

Kurkkaa esimerkki pastennäyttösivusta: http://sooda.dy.fi/fpaste/index.php?af6fdaee3d4d4787ea4f01745df6e84d

Offtopic: Pllk muuten, koodilistauseditointilaatikot vois olla vähän isompia ettei ihan pientä muutosta varte tarttis kopsia uusiks tekstieditoriin ku pitkät rivit rikkoo leiskan :( toivottavasti ei koodi hajoile tost kun päivitin n+1 kertaa et rivit olis lyhyitä.

<?php ob_start(); /* header-pelleilyjen takia */ ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi">
<head>
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
    <title>Filupaste</title>
    <style>
        .tauluerotin {
            background: #ccc;
        }
    </style>
</head>
<body>

<h1>Filupaste</h1>
<?php
// Esimerkkejä, muuta omiin tarpeisiisi sopivaksi
if (!@mysql_connect("localhost", "juser", "passu")) die("<p>Eikä onnistunu yhistämine. :(</p></body></html>");
if (!@mysql_select_db("kanta")) die("<p>Ei onnistunu kannan valinta. :(</p></body></html>");
$filehakemisto = "fileet"; // mihin hakemistoon varastoidaan pastetut tiedostot

// tämä muuttuja kertoo, ollaanko adminina sisällä. Tämä tapa määrittää se on vain esimerkki,
// itellä on ihan eri joka on täysin integroitu sivupohjaan. Muuta tarpeittesi mukaan.
$_ADMIN_LOGGED = $_SERVER["REMOTE_ADDR"] == "192.168.0.2";


// maksimikoko tavuina, huomaa että ei uppaudu jos ylittää php:n oman maksimin,
// joka on serverikohtainen (yleensä luokkaa 8M)
$maxkoko = 1048576;
if (isset($_GET["kaikki"]) && $_ADMIN_LOGGED) { // tuo urliin perään tyyliin index.php?kaikki niin tulee lista
    $kueri = mysql_query("SELECT id, nimi, koko, DATE_FORMAT(aika, '%d.%m.%Y %H:%i:%s') AS paika,
                          ip FROM fpaste ORDER BY aika DESC");
    $yht = mysql_num_rows($kueri);
    if ($yht == 0) echo "<p>Ei filupasteja</p>\n";
    else {
        echo "<p>Yht. $yht</p>\n<p><a href=\"?\">pastaa</a></p>\n<form method=\"get\" action=\"" .
        $_SERVER["PHP_SELF"] . "?mpoista=a\"><table>\n";
        $i = 1;
        while ($rivi = mysql_fetch_assoc($kueri)) {
            $erotin = ($i = 1 - $i) ? ' class="tauluerotin"' : "";
            echo "\t<tr$erotin><td><a href=\"?$rivi[id]\">" . htmlentities($rivi["nimi"]) .
             "</a></td><td>" . round($rivi["koko"] / 1024, 2) .
             "k</td><td>$rivi[paika]</td><td>$rivi[ip]</td><td><input type=\"checkbox\" name=\"id[]\" " .
             "value=\"$rivi[id]\" /></td></tr>\n";
        }
        // voi poistaa monta kerralla :o
        echo '</table><p><input type="submit" value="Poista valitut" />' .
        '<input type="hidden" name="mpoista" value="" /></p></form>' . "\n";
    }
} else if (isset($_GET["mpoista"]) && $_ADMIN_LOGGED) {
    // poistettavien id:t taulukossa, tehdään where id = blaa or id = bloo ... -ehto
    $ehto = "WHERE id = '" . implode("' OR id = '", $_GET["id"]) . "'";
    mysql_query("DELETE FROM fpaste $ehto");
    foreach ($_GET["id"] as $id) @unlink("$filehakemisto/$id");
    echo "<p>Poistettu (toivottavasti)</p>\n";
    header("Location: $_SERVER[PHP_SELF]?kaikki");
} else {
    $hae = substr(urldecode($_SERVER["QUERY_STRING"]), 0, 32);
    if (strlen($hae) == 32) { // sopiva hakuid annettu
        $kueri = mysql_query("SELECT nimi, koko, mime, DATE_FORMAT(aika, '%d.%m.%Y %H:%i:%s') AS aika,
                              ip FROM fpaste WHERE id = '" . addslashes($hae) . "'");
        if (mysql_num_rows($kueri) == 0)
            echo "<p>Filupastea " . htmlentities($hae) . " ei löytynyt!</p>\n";
        else {
            $tiadot = mysql_fetch_assoc($kueri);
            if (isset($_GET["imase"])) { // annetaan tiedosto ulos
                ob_end_clean(); // jo tulostetut tekstit veks
                header("Content-Description: File Transfer");
                header("Content-Type: application/octet-stream");
                header("Size: $tiadot[koko]");
                header("Content-Disposition: attachment; filename=\"" .
                        urlencode($tiadot["nimi"]) . "\";");
                header("Content-Transfer-Encoding: binary");
                header("Content-Length: $tiadot[koko]");
                @readfile("$filehakemisto/$hae");
                die();
            }
            if ($_ADMIN_LOGGED) {
                if (isset($_GET["poista"])) {
                    mysql_query("DELETE FROM fpaste WHERE id = '" . addslashes($hae) . "'");
                    @unlink("$filehakemisto/$hae");
                    $adminjutskut = " <strong>(Poistettu!)</strong> <a href=\"?kaikki\">Listalle</a>\n";
                    header("Location: ?kaikki"); // joo, tää on kuulemma paha tapa, älkää ottako oppia :)
                } else $adminjutskut = " (ip: $tiadot[ip]) <a href=\"?$hae&poista\">Poista</a>\n";
            }
            // näytetään vain tiedot eikä tiedostoa vielä.
            echo "<p><a href=\"?\">Pastaa ite</a></p>\n<p>Fpaste <strong>$hae</strong>, " .
            "<a href=\"?$hae&imase\">" . htmlentities($tiadot["nimi"]) .
            "</a>, upattu mimellä <i>" . htmlentities($tiadot["mime"]) .
            "</i>, koko $tiadot[koko] tavua (" . round($tiadot["koko"] / 1024, 2) .
            " kilotavua), lähetetty $tiadot[aika].$adminjutskut</p>\n";
        }
    } else { // ei hakuja annettu
        $filukka = $_FILES["pastefilu"];
        if (isset($filukka)) { // jaha, yritetään itse upata
            $siirtoeroorit = array("", "Liian iso tiedosto", "Liian iso tiedosto",
            "Tiedosto siirtyi vain osittain", "Tiedosto ei siirtynyt lainkaan", "Serverin sisäinen virhe");
            if ($filukka["size"] > $maxkoko) echo "<p>Tiedosto $filukka[name] on liian suuri! Muista maksimikoko, " .
            round($maxkoko / 1048576, 1) . "Mt.</p>\n";
            elseif ($filukka["error"] != 0)
                echo "<p>Siirrossa tapahtui virhe! (" . $siirtoeroorit[$filukka["error"]] . ")</p>\n";
            elseif ($filukka["tmp_name"] == "")
                echo "<p>Et tainnut valita tiedostoa? <a href=\"?\">Takasi</a></p>\n";
            elseif (is_uploaded_file($filukka["tmp_name"])) {
                $id = md5(uniqid(rand(), true)); // laiska id jota ei voida arvata, tyhmän pitkä vaan :(
                if (@move_uploaded_file($filukka["tmp_name"], "$filehakemisto/$id")) {
                    mysql_query("INSERT INTO fpaste (nimi, mime, koko, aika, id, ip) VALUES
                    ('$filukka[name]', '$filukka[type]', '$filukka[size]', NOW(), '$id', '$_SERVER[REMOTE_ADDR]')");
                    echo "<p>Ok, filu pastattu. <a href=\"index.php?$id\"><strong>$id</strong></a></p>\n";
                    header("Location: ?$id");
                } else echo "<p>Uppaus ei onnistunut!</p>\n";
            } else echo "<p>Uppaus ei onnistunut!</p>\n";
        } else { // mitään tietoja ei olla annettu, siispä näytetään lähetyslomake.
?>
<form enctype="multipart/form-data" action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post"><p>
    <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $maxkoko; ?>" />
    Pastaa tiedosto (maksimi <?php echo round($maxkoko / 1048576, 1); ?> Mt):
    <input type="file" class="tekstiloota" name="pastefilu" />
    <input type="submit" class="nappula" value="Pastaa filu" />
</p></form>
<?php
        }
    }
}
ob_end_flush();
?>
</body>
</html>

Puhveli [10.01.2006 18:03:34]

#

Hee, oonki odottanu että millon mahat julkasta filupastesi sorsan. Mutta herättää mutki kantamaan huolta Suomen nykynuorison kielellisestä rappiosta ku huomaan sun kutsuvan tietokantoja pelkiks kannoiks. :(

Graphic [10.10.2006 18:23:41]

#

Sun kielellinen ulkoasusihan on erittäin vaikuttava.

Techs [13.12.2006 20:22:16]

#

Mikshän mulla ei toimi tuo uppaus oikein? Kun katson kansioon mihin tiedoston piti mennä, siellä on kyllä jotain, mutta sen nimi on joku pitkä sössö merkkejä ja tiedostomuotoa ei ole.

Kun käsin muutin tiedostonimeen oikean päätteen tiedosto kyllä toimii oikein.

sooda [13.12.2006 22:14:52]

#

Oikein se toimii. Ei niitä tiedostoja sieltä käsin kuulukaan käsitellä, ne menevät tarkoituksella sekaviksi (samaksi kuin id-numero, huomasitko?). Kyllä ne oikein toimivat vaikka pääte olisi mitä, ei se itse tiedosto siitä mihinkään muutu. Samannimiset eivät aiheuta ongelmia tälleen.

Ja "vinkkihän" tämä vain, itselläkin nykyään vähän parempi versio käytössä. Saa sitä muokata omiin tarpeisiin :)

Tomppa32 [03.03.2012 17:36:50]

#

Tein oman versioni.. Okei myönnetään että oon joskus hieman perfektionisti, mutta mielestäni sain aikaiseksi ihan mukavan näkösen filukkapasten.

Ja Soodalle kiitos tuosta pohjasta. Paljon helpompi lähteä kasailemaan kun on annettu valmiiksi suuntaa toteutukselle.

Omaa viritystäni pääsee testailemaan täällä:
http://koti.mbnet.fi/tompz/filepaste/index.php

Valitettavasti en viitsi sorsaa pistää julkisesti näkyviin, sen verta kauan aikaa käytin ton purkkavirityksen kokoamiseen että haluan pitää salaisuudet itselläni. :)

Vastaus

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

Tietoa sivustosta