Visualizzazione risultati 1 fino 25 di 25

Discussione: Algoritmo per hosting immagini con suddivisione in cartelle in base all'id.

  1. #1
    Guest

    Predefinito Algoritmo per hosting immagini con suddivisione in cartelle in base all'id.

    Siccome molti hosting non permettono delle liste enormi di file, sono costretto ad utilizzare qualche script che mi divida in cartelle e sub cartelle tutte le immagini.
    Mi servirebbe uno script che mi carichi i file in apposite cartelle in base all'id, per esempio:
    Codice:
    images
    |- 1_1000
    |- 1001_2000
    |- 2001_3000
    |- 3001_4000
    Però essendo un numero auto_increment, come posso impostare delle condizioni al momento l'upload in modo da caricarmi correttamente le immagini e, nel caso, cancellarle nella directory apposita?

  2. #2
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    ciao,

    potresti fare come ho fatto qui in questa tag-board, semplicemente ogni 10 messaggi creo un nuovo file di testo:
    http://eurosalute.altervista.org/bctag/

    apllichi questo algoritmo ai file immagine, es. ogni 10 file img crei una nuova cartella o sottocartella dove memorizzi i successivi 10 file e così via....

    appena ho tempo voglio fare alcune prove qui:
    http://eurosalute.altervista.org/rotating_banner/admin/

    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  3. #3
    Guest

    Predefinito

    Sinceramente non mi è utile, perché non hai messo nulla di nuovo. So anche io che devo creare una cartella, ma come posso far capire allo script che quell'immagine va in quella cartella? Dev'essere una cosa DINAMICA, non devo creare una condizione a mano ogni volta che si raggiunge un numero di immagini.


  4. #4
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    ALLORA , Ho fatto alcune prove sul codice di questa pagina:
    http://eurosalute.altervista.org/rotating_banner/admin/

    ho fatto in modo tale che ogni 5 file immagine caricati , crea una nuova sub-cartella e carica i successivi 5 file nelle sotto cartelle che crea dinamicamente...e così via...
    INOLTRE ho fatto in modo che cancellando un file in quella cartella , carichi il file nuovo in quella cartella.

    ORA devo modificare la tabella del database in modo tale che legga il contenuto di ogni singola cartella singolarmente....

    spero che ti sia utile....

    nb: il codice non è completo ed è in fase di test..... si può editare o cancellare solo le immagini che appaiono
    Ultima modifica di EuroSalute : 10-10-2010 alle ore 22.44.12 Motivo: più info
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  5. #5
    Guest

    Predefinito

    Non mi hai capito. Il concetto che tu stai scrivendo io cel'ho già in mente! Il mio problema è metterlo in atto con il PHP! In poche parole mi servirebbe un esempio di snippet che mi permetta di far ciò.
    Io lavoro sugli ID e RARAMENTE verranno cancellati dati, quindi ID.

  6. #6
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    non so se è giusto fare così, ma potresti aggiungere all' id dell'immagine un numero progressivo intero che identifica la cartella corrispondente, in fase di upload.....

    nel mio caso ho :
    Codice PHP:
    $bannerid = date('YmdGis').$sub;
    $sub è numerico(come è numerico $bannerid) intero identificativo della sotto cartella che vado a creare e cancellare automaticamente ad ogni richiesta.

    ho eseguito una ulteriore modifica allo script, ma devo ancora provare quest'ultima...
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  7. #7
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    mentre la carichi, inserisci una nuova query, ne recuperi l'id con una select sull'ultimo inserito e poi te la salvi come e dove vuoi...
    non è mai stato cosi semplice..
    Ultima modifica di Xsescott : 13-10-2010 alle ore 18.57.20
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da Xsescott Visualizza messaggio
    mentre la carichi, inserisci una nuova query, ne recuperi l'id con una select sull'ultimo inserito e poi te la salvi come e dove vuoi...
    non è mai stato cosi semplice..
    1- Non c'è bisogno di usare un'altra select dato esiste mysql_nextid().
    2- Mi serve sapere come poter fare un confronto. Allora, mi spiego meglio con un esempio:
    Codice PHP:
    function check_id(int $id)
    {
    if ((
    $id >= 1) && ($id <= 1000))
    {
    return
    'images/1_1000';
    }
    if ((
    $id >= 1001) && ($id <= 2000))
    {
    return
    'images/1001_2000';
    }
    if ((
    $id >= 2001) && ($id <= 3000))
    {
    return
    'images/2001_3000';
    }
    }
    Ora, mi dovrebbe resistituire la path giusta, ma dato che lo script di upload esegue il caricamento e carica l'immagine rinominandola con l'id, ogni volta che si caricano mille immagini dovrei modificare lo script a mano per aggiungere una condizioni di 999 immagini in più e non è proprio il caso. Quindi chiedevo se esistesse una soluzione a questo problema in modo che sia GENERALE e DINAMICA in base alle esigenze e non si debba modificare a mano.

    Grazie, in ogni caso, delle risposte date fino ad ora

  9. #9
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    scusa, ma non devi fare questo tipo di confronti.......è assurdo...

    devi modificare lo script di upload delle immagini in modo tale che ogni 999 immagini(o il numero che desideri) crei una nuova sottocartella (nella cartella principale) con un id progressivo....

    faccio un semplice esempio:
    Codice PHP:
    $pathimages = '../images';
    if (!
    file_exists($pathimages)) mkdir($pathimages, 0700);
    $pathsub = '/sub'.$sub;
    if (!
    file_exists($pathimages.$pathsub)) mkdir($pathimages.$pathsub, 0700);
    $filepath = $pathimages.$pathsub.'/';
    |
    |
    |
    $array_files=glob($filepath.'*.'.$ext)?glob($filepath.'*.'.$ext):array();
    $count_array_files=count($array_files);
    if (
    $count_array_files == 100){
    $sub = $sub + 1;
    }

    |
    |
    |
    $pathsub = '/sub'.$sub;
    if (!
    file_exists($pathimages.$pathsub)) mkdir($pathimages.$pathsub, 0700);
    $filepath = $pathimages.$pathsub.'/';

    |
    |
    |
    ora è che non sapendo come è il tuo script di upload delle immagini, non posso aiutarti più di tanto....

    sprit....
    Ultima modifica di EuroSalute : 15-10-2010 alle ore 20.41.44 Motivo: più info
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  10. #10
    Guest

    Predefinito

    Il mio è un semplice form di upload che carica l'immagine in una data cartella.
    la mia condizione non è assurda per il semplice fatto che:
    1. Facendo un glob per il popolamento di un array è un lavoro per il server che si può e si dovrebbe evitare.
    2. Mi serve perché quando vado a cancellare un'immagine mi serve sapere in che cartella è presente, altrimenti come potrei cancellarla? Come fa lo script a sapere che l'immagine 1200 è nella cartella 1001_2000? Per questo mi serve lavorare con gli ID ed avere una funzione che mi restituisca la cartella, poi se serve per caricare o cancellare un'immagine è indifferente.

    Stavo pensando a fare un qualcosa con substr() per prendere il primo e l'ultimo numero, poi fare un controllo per il numero delle cifre (4 = 1000, 5 = 10000, ecc), ma mi pare troppo macchinoso e non risolve il mio problema di modificare la funzione a mano ogni volta che raggiungo un certo numero di immagini caricate.

  11. #11
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    per il fatto della funzione glob che carica troppo il server, non saprei, ma potresti comunque pensare ad un numero inferiore di immagini per cartella(per es 100, e non quel 999 fastidioso).....

    dal mio esempio(http://eurosalute.altervista.org/rotating_banner/admin/)

    questo script sa benissimo dove sono le immagini per ogni sottocartella creata, perchè ho modificato la tabella del database, aggiungendo un nuovo campo subid identificativo di ogni sottocartella....
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  12. #12
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Con una funzione simile:
    Codice PHP:
    function check_id ($id) {
    if(
    $id > 0 && $id <= 1000) { // per i numeri inferiori di 1000 e maggiori di 0 non ne vale la pena fare tutti i procedimenti sottostanti...
    return 'images/1_1000';
    }

    $n = substr($id, 0, 1);
    $len = strlen($id);
    $len = $len <= 3 ? 3 : $len - 1;

    $pow = pow(10, $len);
    $diff = abs($pow - $id);
    $start = $id - $diff + 1;
    $end = $start + $pow - 1;

    $start = intval(($n - 1) . substr($start, 1));
    $end = intval($n . substr($end, 1));

    if(
    $start === 1) {
    $start = $end - ($pow / 10) + 1;
    }

    return
    'images/' . $start . '_' . $end;
    }
    Dovresti essere in grado di ricavare la cartella. Per ora l'ho provata solo con numeri con 3 zeri, devo fare altre prove.

    Edit: ho aggiornato la funzione, sembra funzionare anche con numeri superiore a 3 zeri...
    Ultima modifica di javascripter : 15-10-2010 alle ore 21.19.08

  13. #13
    Guest

    Predefinito

    Io ho risolto utilizzando questa, che ha cambiato solo due cosettine:
    Codice PHP:
    function check_id ($id)
    {
    if ((
    $id > 0) && ($id <= 1000))
    {
    return
    'images/1_1000';
    }

    $n = substr($id, 0, 1);
    $len = strlen($id);
    $len = $len <= 3 ? 3 : $len - 1;

    $diff = abs(pow(10, $len) - $id);
    $start = $id - $diff + 1;
    $end = $start + 999;

    $start = intval(($n) . substr($start, 1));
    $end = intval($n + 1 . substr($end, 1));

    return
    'images/' . $start . '_' . $end ;
    }
    Tutte e due restituivano la cartella sbagliata di 1000, quindi mi è bastato eliminare il -1 a $start ed aggiungerlo a $end, in questo modo funziona, ma solamente in parte, perché se uso un numero che è perfettamente divisibile per 1000 (2000, 3000, 4000, 5000) restituisce la cartella sbagliata e se metto un numero maggiore di 9999, non è più 1000 a 1000, ma 10000 a 10000, esempio:
    Codice:
    echo check_id(9999); # Restituisce correttamente images/9001_10000
    echo check_id(99991); # Restituisce images/90001_101000
    Ti ringrazio infinitamente per l'aiuto che stai dando

  14. #14
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Ho semplicato la funzione:
    Codice PHP:
    function check_id ($id)
    {
    if ((
    $id > 0) && ($id <= 1000))
    {
    return
    'images/1_1000';
    }

    $n = substr($id, 0, 1);
    $len = strlen($id);
    $len = $len <= 3 ? 3 : $len - 1;

    $start = intval($n . str_repeat('0', $len - 1) . 1);
    $end = intval($n + 1 . str_repeat('0', $len));

    return
    'images/' . $start . '_' . $end ;
    }
    E:
    Codice PHP:
    echo check_id ( 99991 );
    stampa images/90001_100000

  15. #15
    Guest

    Predefinito

    Grazie infinite Javascripter, ma è sbagliato perché:
    1. Se l'id è 1000 o 2000 o 3000 ecc mi stampa 1001_2000 o 2001_3000 o 3001_4000;
    2. Il range con numeri sopra il 9999 è sbagliato perché non è più di 999 in 999, ma di 9999 in 9999.

    Infatti, se scrivi 99991, il risultato è 90001_100000 e facendo 100000 - 90001 restituisce 9999, quando dovrebbe restituire 999. e la cartella dovrebbe essere 99001_100000. Questo problema credo sia dovuto al fatto che substr() prende SOLO il primo numero, quindi si dovrebbe fare in modo dinamico in base alle migliaia dell'ID, così da fare il range sempre di 999.
    Ci ho provato, ma senza risultati. Ho provato, per esempio, usando number_format() e poi facendo explode() per contare quante migliaia ci sono per poi fare il conteggio e la moltiplicazione per il tot di migliaia.

    Mi sto incasinando però

    Ripeto, grazie ancora per il supporto

  16. #16
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Ho capito.
    In questo caso ho deciso di cancellare tutto e riscrivere la funzione daccapo! Ecco cosa ne è uscito:
    Codice PHP:
    function check_id ($id)
    {
    $diff = (int) substr($id, -3);

    $start = $id - ($diff === 0 ? 1000 : $diff) + 1;
    $end = $start + 999;

    return
    'images/' . $start . '_' . $end;
    }
    Sembra funzionare correttamente... Fai qualche prova anche tu.

  17. #17
    Guest

    Predefinito

    Sembra funzionare correttamente. Grazie infinite per il supporto Javascripter, lo terrò a mente

    Ovviamente ringrazio anche gli altri utenti che hanno risposto al mio problema.


  18. #18
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    pomeriggio te l'avevo scritta anch'io una funzioncina ma la mia ragazza proprio in quel frangente mi ha costretto a spegnere il pc che era pronto il pranzo e alla fine non te l'avevo postata, visto che l'avevo scritta la posto

    Codice PHP:
    function check_id($id){
    $unita=1000;
    $inizio=1;
    $fine=0;
    while(
    true){
    $fine=$unita;
    if(
    $id<=$unita){ return $inizio."_".$fine;}
    else{
    $unita=$unita+1000;
    $inizio = $inizio+1000;}
    }}
    ps. preferisco quella di js dato che sfrutta a pieno le potenzialità di php ed è piu intelligente dato che evita di fare cicli inutili :)

    bye
    Ultima modifica di Xsescott : 17-10-2010 alle ore 03.20.45
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  19. #19
    Guest

    Predefinito

    Sono costretto a ritirare su il thread per modificare la funzione scritta da Javascripter. Ho provato invano a modificare la funzione.

    Vorrei che per ogni cartella ci siano più file! 1000 sono davvero pochi per il sistema che sto utilizzando e vorrei che ce ne fosse minimo 3000/4000!

    Chi potrebbe aiutarmi?

  20. #20
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    L'ho modificata rapidamente, non ho controllato se funziona correttamente ( di sfuggita mi sembra di si ) :
    Codice PHP:
    function check_id ($id)
    {
    $diff = (int) substr($id, -strlen($id));

    $start = $id - ($diff === 0 ? 4000 : $diff) + 1;
    $end = $start + 3999;

    return
    'images/' . $start . '_' . $end;
    }

  21. #21
    Guest

    Predefinito

    Quella modifica è stata fatta anche da me e non funziona perché ogni mille, aumenta $end e $start, quando dovrebbe rimanere fisso per ogni 4000!

  22. #22
    Guest

    Predefinito

    Evitate di trattare i numeri come tringhe... provala e dimmi (ho fatto pochi test...):
    Codice PHP:
    function check_id ($id)
    {
    $numero_img_dir = 4000; // "circa" dati i delete
    $end = ((floor($id/($numero_img_dir+1))+1)*$numero_img_dir);
    $start = ($end - $numero_img_dir) != 0 ? ($end - $numero_img_dir +1) : 1;
    return
    $start.'_'.$end;
    }
    PS: se vieni sul mio sito guarda l'ultimo articolo che ho pubblicato... ironia della sorte...

    PS2: prova questa... quella di prima mi sà che è errata...
    Codice PHP:
    function check_id ($id)
    {
    $numero_img_dir = 4000; // "circa" dati i delete
    $end = ((floor(($id-1)/$numero_img_dir))*$numero_img_dir)+$numero_img_dir;
    $start = ($end - $numero_img_dir +1);
    return
    $start.'_'.$end;
    }
    PS 3: mi ha fatto talmente intestardire che ho fatto pure la funzione test... sembra che va ok la seconda che ti ho postato:
    Codice PHP:
    function check_id ($id)
    {
    $numero_img_dir = 4000; // "circa" dati i delete
    $end = ((floor(($id-1)/$numero_img_dir))*$numero_img_dir)+$numero_img_dir;
    $start = ($end - $numero_img_dir +1);
    return
    $start.'_'.$end;
    }

    for(
    $i=1; $i<=30; $i++) // facciamo 30 test
    {
    $random = rand(0, 50000);
    echo
    check_id($random).'/'.$random.'<br />';
    $testing = explode('_', check_id($random));
    list(
    $start, $end) = $testing;
    if((
    $random<$start) OR ($random>$end))
    {
    exit(
    'errore al numero: '.$random);
    }
    }
    Ultima modifica di miniscript : 09-03-2011 alle ore 21.00.43

  23. #23
    Guest

    Predefinito

    Grazie miniscript, senza funzionare correttamente

    Grazie anche gli altri per l'attenzione datami :mgreen:

  24. #24
    Guest

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    senza funzionare correttamente
    senza cioè non funziona?
    il "senza" vuol dire "sembra"?

  25. #25
    Guest

    Predefinito

    Si scusami, un lapsus che non ricordo a cosa sia dovuto

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •