Classi per la configurazione upload
Cristiano Magro
2019-07-09 d5966c9e396b6d15bf079dc6378652403e0ed319
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
 
/**
 * Alcune funzioni comuni da utilizzare per eserguire l'upload dei file
 *
 * @author Cristiano Magro
 */
class FileUpload {
 
    const SLUG_CHAR = "_";
 
    private static $cp1252_map = array(
        "\xc2\x80" => "\xe2\x82\xac", /* EURO SIGN */
        "\xc2\x82" => "\xe2\x80\x9a", /* SINGLE LOW-9 QUOTATION MARK */
        "\xc2\x83" => "\xc6\x92", /* LATIN SMALL LETTER F WITH HOOK */
        "\xc2\x84" => "\xe2\x80\x9e", /* DOUBLE LOW-9 QUOTATION MARK */
        "\xc2\x85" => "\xe2\x80\xa6", /* HORIZONTAL ELLIPSIS */
        "\xc2\x86" => "\xe2\x80\xa0", /* DAGGER */
        "\xc2\x87" => "\xe2\x80\xa1", /* DOUBLE DAGGER */
        "\xc2\x88" => "\xcb\x86", /* MODIFIER LETTER CIRCUMFLEX ACCENT */
        "\xc2\x89" => "\xe2\x80\xb0", /* PER MILLE SIGN */
        "\xc2\x8a" => "\xc5\xa0", /* LATIN CAPITAL LETTER S WITH CARON */
        "\xc2\x8b" => "\xe2\x80\xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
        "\xc2\x8c" => "\xc5\x92", /* LATIN CAPITAL LIGATURE OE */
        "\xc2\x8e" => "\xc5\xbd", /* LATIN CAPITAL LETTER Z WITH CARON */
        "\xc2\x91" => "\xe2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
        "\xc2\x92" => "\xe2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
        "\xc2\x93" => "\xe2\x80\x9c", /* LEFT DOUBLE QUOTATION MARK */
        "\xc2\x94" => "\xe2\x80\x9d", /* RIGHT DOUBLE QUOTATION MARK */
        "\xc2\x95" => "\xe2\x80\xa2", /* BULLET */
        "\xc2\x96" => "\xe2\x80\x93", /* EN DASH */
        "\xc2\x97" => "\xe2\x80\x94", /* EM DASH */
        "\xc2\x98" => "\xcb\x9c", /* SMALL TILDE */
        "\xc2\x99" => "\xe2\x84\xa2", /* TRADE MARK SIGN */
        "\xc2\x9a" => "\xc5\xa1", /* LATIN SMALL LETTER S WITH CARON */
        "\xc2\x9b" => "\xe2\x80\xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION */
        "\xc2\x9c" => "\xc5\x93", /* LATIN SMALL LIGATURE OE */
        "\xc2\x9e" => "\xc5\xbe", /* LATIN SMALL LETTER Z WITH CARON */
        "\xc2\x9f" => "\xc5\xb8" /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
    );
 
    /**
     * Genero un numero unico.<br>
     * un intero composto da un progressivo generato su base data, unito con un randomico.<br>
     * Il progressivo su base data dovrebbe evitare collisioni sul lungo periodo. (27 anni)<br>
     * !!!<b>Assicurarsi di memorizzare il dato in database come string, altrimenti eventuali zeri iniziali
     * vengono persi in un campo integer</b>!!!
     *
     * @return string
     */
    public static function getProgressivoFile() {
        $now = time();
        $data_inizio_conteggio = strtotime("2014-06-01");
        $datediff = $now - $data_inizio_conteggio;
        $gg_trascorsi = floor($datediff / (60 * 60 * 24));
        $numero_unico = str_pad($gg_trascorsi, 4, "0", STR_PAD_LEFT) . rand(10000, 99999);
        return $numero_unico;
    }
 
    public static function utf8_iso8859($txt) {
        return utf8_decode(strtr($txt, array_flip(self::$cp1252_map)));
    }
 
    public static function iso8859_utf8($txt) {
        return utf8_encode(strtr($txt, self::$cp1252_map));
    }
 
    /**
     * ripulisco la stringa dai caratteri accentati, sostituendoli opportunamente con un carattere
     * specifico o con nulla.
     *
     * @param string $string da ripulire
     *
     * @param mixed  $slug   carattere sostitutivo
     *
     * @return string stringa ripulita dalle lettere accentate converita in minuscolo
     */
    public static function rimuoviAccenti($string, $slug = false) {
        $string = strtolower($string);
 
        // codice ASCII delle vocali
        $ascii['a'] = range(224, 230);
        $ascii['e'] = range(232, 235);
        $ascii['i'] = range(236, 239);
        $ascii['o'] = array_merge(range(242, 246), array(240, 248));
        $ascii['u'] = range(249, 252);
 
        // codice ASCII degli altri caratteri
        $ascii['b'] = array(223);
        $ascii['c'] = array(231);
        $ascii['d'] = array(208);
        $ascii['n'] = array(241);
        $ascii['y'] = array(253, 255);
 
        foreach ($ascii as $key => $item) {
            $acentos = '';
            foreach ($item as $codigo) {
                $acentos .= chr($codigo); }
            $troca[$key] = '/[' . $acentos . ']/i';
        }
 
        $string = preg_replace(array_values($troca), array_keys($troca), $string);
 
        $slug = self::getSlugValido($slug);
        if ($slug) {
            // Scambio tutto ciò che non è una lettera o un numero per carattere
            $string = preg_replace('/[^a-z0-9_.]/i', $slug, $string);
            // Strip dei caratteri ripetuti
            // $string = preg_replace('/' . $slug . '{2,}/i', $slug, $string);
            // $string = trim($string, $slug);
        }
 
        return $string;
    }
 
    /**
     * Verifico che il collante SLUG utilizzato sia un carattere accetabile:
     * tra: a-z0-9_.
     * Altrimenti restituisco quello di default
     *
     * @param char $collante carattere da utilizzare come collante
     *
     * @return mixed false nessun collante|carattere valido
     */
    private static function getSlugValido($collante) {
        if (!$collante) {
            return false;
        }
 
        if ($collante === true) {
            return self::SLUG_CHAR;
        }
 
        return preg_replace('/[^a-z0-9_.]/i', self::SLUG_CHAR, $collante);
    }
 
 
    /**
     * Ripulisco il nome di un file da lettere accentate e caratteri speciali.
     *
     * @param stringa $nomeFile nome del file originale
     *
     * @return string nome file valido per il sistema ripulito da accenti e charatteri strani
     */
    public static function clearNomeFile($nomeFile = "") {
        if ($nomeFile) {
            $file_name = self::utf8_iso8859($nomeFile);
            return self::rimuoviAccenti($file_name, "_");
        }
        return $nomeFile;
    }
 
}