• User Newbie

    Upload funziona in locale ma non in remoto

    Ciao a tutti questo è il mio primo post su questo forum.

    Parto subito chiarendo il mio problema sperando che qualcuno abbia un'intuizione.

    Ho uno script PHP che mi permette di fare l'upload di file all'interno di un database MySQL.

    Sia in locale che in remoto php.ini è settato così:
    file_uploads On
    upload_max_filesize 8M
    max_execution_time 30
    post_max_size 8M

    La versione di PHP è 5 (anche se in locale è un po' più agggiornata).
    In locale uso Debian in remoto credo che sul server giri Fedora (o Red Hat).

    In locale funziona tutto perfettamente, mentre in remoto ci sono problemi per alcuni file. Infatti in remoto riesco ad uploadare con certezza file fino a circa 700Kb, mentre non riesco ad uploadare file > 1.1Mb (il limite immagino stia nel mezzo).

    Ho pensato che il problema fosse che in remoto ci si mettesse più di 30 secondi per eseguire l'upload ma invece ho notato che l'upload fallisce molto prima (intorno ai 18 secondi).

    Ho controllato $_FILES['nomedelfile']['error'] ma l'uscita è 0 vale a dire nessun errore.

    PHP nopn da nessun errore, semplicemente fallisce la query:
    $queryallegatif1 = "INSERT INTO $tab_allegati (collega, user, numero, nome, type, size, contenuto) VALUES ('$collegato', '$utente', '1', '$nomef1', '$file1_t', '$file1_s', '$contentf1')";

    Forse dovrei postare parti del mio codice php anche se credo che sia più un problema di settaggio del server.

    Qualcuno ha qualche idea?

    Grazie
    ciao


  • User Attivo

    Dubito che sia un problema di settaggio di server.

    Posta lo script in modo da vedere cosa e dove sbagli..Che errore ti da la query?


  • User Newbie

    Grazie per la risposta.

    Il file intero è piuttosto lungo, allego solo le parti relative al upload:

    In questa parte prendo i dati che arrivano da un form html con enctype="multipart/form-data" controllo il MIME e la grandezza:

    [php]
    // FILES

    $max_file_size = 2097152; // byte = 2Mb
    $chevale = $max_file_size / 1048576;
    $chevale = number_format($chevale, 2);

    $caricabilif = array("application/msword","application/doc","application/rtf","application/pdf", "application/ps", "application/eps", "application/postscript", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/zip", "application/x-rar-compressed", "application/x-rar", "application/rar");

    $filesi = 0;
    //faccio lo stesso con il file 1

    if ($_FILES['msfile1'] > 0) {

    $file1_n=$_FILES['msfile1']['name']; 
    $file1_t=$_FILES['msfile1']['type']; 
    $file1_s=$_FILES['msfile1']; 
    $file1_tmp=$_FILES['msfile1']['tmp_name']; 
    $file1_e=$_FILES['msfile1']['error']; 
    //echo"<br />nome: ".$file1_n." errore: ".$file1_e." size= ".$file1_s."<br />";
    
    
    if ($nomef1 == '') {
    $nomef1 = $file1_n;
    }
    
    // Controllo che il file sia in uno dei formati caricabili 
    if (!in_array($file1_t,$caricabilif)){ 
            echo"<u>WARNING</u> file 1  should be one of the following type: .doc, .rtf, .xls, .pdf, .ps, .eps, .ai, .pps, .ppt, .zip, .rar.<br />  &raquo; <a href=\"javascript:history.back()\"> Go back</a><br /><br /><br />";
            echo "</div>
          </div>
          </div>"; 
            include("sotto.html"); 
            exit();
    }
    //echo"<br />passa il controllo mime<br />";
    
    // controllo che il file non sia più grande di max file size 
    if ($file1_s > $max_file_size){ 
           echo "<u>WARNING</u> file 1 cannot be larger than ".$chevale." Mb.<br /> &raquo; <a href=\"javascript:history.back()\"> Go back</a><br /><br /><br />";
           echo "</div>
          </div>
          </div>"; 
           include("sotto.html"); 
           exit(); 
    }
    //echo"<br />passa il controllo megabyte<br />";
    
    $grande = $file1_s / 1048576;
    //echo "<br /><br /><br />file 1 is set e grande: ".$grande."<br /><br /><br />";
    
    $checkf1 = 0;    
    $numero = 1;
    $f1 = 1;
    $filesi = 1;
    
    
    $fp= fopen($file1_tmp, 'r');
    $contentf1= fread($fp, filesize($file1_tmp));
    $contentf1= addslashes($contentf1);
    fclose($fp);
    

    }
    [/php]e qui inserisce i dati nel DB:

    [php]
    if ($f1 == 1) {
    //echo"<br />ora dovrà inserire i dati di file 1 in tabella<br />";

        $queryallegatif1 = "INSERT INTO $tab_allegati (collega, user, numero, nome, type, size, contenuto) VALUES ('$collegato', '$utente', '1', '$nomef1', '$file1_t', '$file1_s', '$contentf1')";
        
        
        if (mysql_query($queryallegatif1, $db) ) { 
            $checkf1 = 1;
            echo "File 1  <b>".$nomef1."</b> has been successfully uploaded.<br /><br /> "; 
        }
        else {
            $checkf1 = 0; 
            echo "<u>WARNING</u>, file 1  <b>".$nomef1."</b> has not been uploaded.<br /><br /> ";
             
        }
        
    }
    

    [/php]Non mi da nessun tipo di errore, semplicemente la query per file superiori a circa 1Mb in remoto non va a buon fine.

    Potrebbe essere un problema con il max_allowed_packet di mysql?

    Se hai bisogno di altro fammi sapere.

    Grazie ciao


  • User

    Ciao,
    hai provato a spostare il file caricato in un percorso creato da te, magari con move_uploaded_file()?
    forse $contentf1= fread($fp, filesize($file1_tmp)); non va a causa permessi 😕

    Hai provato a stampare mysql_error()?


  • User Newbie

    Grazie per la risposta.

    Il problema sta nel "max_allowed_packed" di MySql che è di default fissato a 1Mb.

    Inserendo [php]echo "Error number: ".mysql_errno($db)."<br />";[/php] infatti mi esce l'errore 1153:

    ERROR 1153: Got a packet bigger than 'max_allowed_packet' bytes.

    Credo che dovrò intervenire via ssh su mysql ma prima devo chiedere l'autorizzazione al gestore del server... va beh, comunque il problema può considerarsi risolto.

    Grazie.

    Ciao


  • User

    eh purtroppo i gestori sono sempre poco generosi con le risorse