Elikä jos sivuilla on tiedostojen uploadaus, jonka yhteydessä tallennetaan tiedoston alkuperäinen nimi tietokantaan, ja uploadattu tiedosto nimetään järjestysnumerolla ykkösestä eteenpäin.
Miten onnistuisi että kun vaikka tiedostoa 142 ladataan, se nimettäisiin automaattisesti sen nimiseksi kuin kannasta löytyy?
mysql_insert_id();
ja move_uploaded_file:llä "nimetä tiedosto".
Miksi muuten näin tehdään? Numerojärjestyksessä nimeäminen mahdollistaa periaatteessa "tietoturvariskille", koska pienellä skriptillä voi tällöin ladata kaikki tiedostot helposti (sikäli mikäli joukossa on tiedostoja, jotka eivät näy muille käyttäjille).
Itse upload-vaiheessa siivoisin tiedoston nimen, tarkistaisin saman nimisen tiedoston varalta ( siirtäisi tiedoston) ja tallentaisin vaan kantaan tiedoston nimen (+osoitteen, jos useita hakemistoja), jolloin tiedoston nimi kertoisi minullekin jotain, ilman että sitä pitää tarkistaa kannasta.
Taisin selittää hieman huonosti, no yritetään uudelleen.
Siis uudelleen nimeäminen tiedoston lataus vaiheessa, ei lähetyksessä. Esim. sivulla on linkki tiedostoon, kun hiiren vie linkin päälle, tilarivillä lukee jotain "http://www.sivu.com/tiedostot/27.file", kun siitä klikkaa, latausikkunassa lukee tiedoston alkuperäinen nimi, vaikka "bananas.jpg".
Tämmöinen vaiva sen vuoksi, että sivulla jolle tämä tulisi, olisi suuri mahdollisuus että uploadattavat tiedostot ovat samannimisiä, siksi niiden nimet otettaisiin talteen tietokantaan ja itse tiedostot muutettaisiin pelkiksi numeroiksi joiden mukaan nimet haetaan latausvaiheessa. Kaikki nämä tiedostot olisi kanssa vapaasti ladattavissa, niin tuosta 'tietoturvariskistä' ei olisi kuin haittaa haksorille.
Siltikin uskoisin että http://www.sivu.com/tiedostot/opinnaytetyo-masiinan-kokoaminen-3.rtf kertoo enemmän lataajalle kuin 27.file.
Joku download.php, joka ottas osoiteriviltä ID:n, hakis kannasta oikean tiedostonimen, ja ohjais käyttäjän tuonne tiedostoon.
Melkein kuin tsuriga sanoi, viimeisessä kohdassa vain epäselvyyttä. Eihän siis pidä uudelleenohjata mitään, vaan se käyttäjän klikkaama tiedosto nimettäsiin uudelleen.
Alkaa kyllä vaikuttamaan mahdottomalta. Otan vastaan myös ehdotuksia, mitä avuksi, jos haluan että käyttäjät voivat lähettää tiedostoja ja ladata ne samannimisinä kuin lähettivätkin, ilman että tulee ongelmia tiedostonimien kanssa.
Ensimmäisenä tulis mieleen, että otetaan se alkuperänen tiedostonimi ja pökätään joku (esim. kellonajasta muodostettu) uniikki ID perään.
Kermakana:
Siis missä on ongelma? Etkö saa kopioitua tiedostoja palvelimelle? Etkö osaa nimetä niitä?
Oletko tehnyt jo jotain koodia, missä teet noita asioita vai onko vasta suunnitteluasteella?
Laita koodia kehiin, jos on jo jotain valmista niin katsotaan porukalla yhdessä.
Lebe:
Tämä tulisi siis projektiini, jossa voi mm uploadata pelin replay tiedostoja, joita muut voivat ladata ja katsoa.
Olen jo tehnyt upload scriptin joka toimii ok, mutta nyt myöhemmin tuli mieleen tämä ongelma, eli on suuri mahdollisuus että uploadattavat tiedostot on samannimisiä, mutta silti eri tiedostoja.
Ensin muutin upload scriptin nimeämään replayt numeroiksi, mutta se ei taas olisi hirveän mukavaa näitä tiedostoja lataavalle, koska ne joutuu aina nimeämään itse käsin uudestaan että niitä pystyy käyttämään.
Eli siis jotenkin pitäisi saada lähetysvaiheessa tallennettut tiedostonimet noiden palvelimella olevien 1, 2, 3, 4.. filujen tilalle kun niitä ladataan.
Esim. <a href="tiedostot/124.file">replay2.rep</a> <- tuosta kuin painaisi, niin 124.file onkin latausikkunassa replay2.rep niminen.
(tiedän että olen huono selittämään :q)
<?php # <a href="lataa.php?id=123"> $id = $_GET['id']; $file = hae_tiedoston_nimi($id); # Tai suoraan vaikka "{$id}.file" $name = hae_tiedoston_alkuperainen_nimi($id); header("Content-type: text"); # tai mikä lie header("Content-Disposition: attachment; filename=\"{$name}\""); readfile($file); ?>
Jos tiedoston tallennusnimen saa näppärästi numerosta suoraan, riittää, että pidät vaikka toisessa tiedostossa numeroa vastaavalla rivillä tiedoston alkuperäistä nimeä.
<?php //vaikka download.php, tänne ei muuta tulostusta, kuin se tiedosto! // kerrotaan selaimelle, että halutaan ladata tiedosto, (vaikka nyt ohjelma) header('Content-type: application/octet-stream'); // ja tallentaa se nimellä oikeanimi.rep header('Content-Disposition: attachment; filename="oikeanimi.rep"'); // tähän se tiedoston tulostus, sovitaan vaikka että 123.file readfile('123.file'); ?>
Tulikin sama jo yllä ^^
Kovin erinomaista!
Kiitos Metalle ja Legulle, juuri tätä ajoin takaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.