Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    34

    Problema con upload di file grandi

    Salve a tutti,

    il mio problema riguarda l'upload di file piuttosto grandi (30-40Mb).
    Quando cerco di caricare e salvare nel database un file di quelle dimensioni (sia da locale sia da remoto) non mi si salva, ma non ricevo alcun messaggio d'errore.
    Ciò che vedo a video è esattamente ci che vedo quando eseguo l'upload di file più piccoli (10Mb) solo che poi il database non viene modificato.
    Ringrazio anticipatamente per ogni suggerimento/consiglio/aiuto!!!

    Di seguito posto alcuni dettagli sul sistema:

    Server/php/database: EasyPHP 1.8.0.1
    (Scelta discutibile, lo so, ma è tanto comodo...)

    php.ini
    • safe_mode = Off
    • max_execution_time = 45
    • max_input_time = 120
    • memory_limit = 64M
    • error_reporting = E_ALL
    • post_max_size = 64M
    • file_uploads = On
    • upload_tmp_dir = "f:\Siti\DJGulp3\download\"
    • upload_max_filesize = 64M

    anche eliminando le seguenti righe di configurazione non migliorano i risultati:
    • max_execution_time = 45
    • max_input_time = 120
    • memory_limit = 64M


    my.ini
    • max_allowed_packet=67108864


    Il codice che uso per fare l'upload è:

    html
    codice:
    <form name="nuovo" method="POST" action="<?php echo "$_SERVER[PHP_SELF]" ?>" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="67108864">
    File da caricare: <input type="file" name="docs">
    
    Descrizione: <input type="text" name="descr">
    
    <input type="submit" value="Carica">
    </form>
    php
    Codice PHP:
    if($_FILES['docs']['size'] > 0) {
        
    $fileName basename($_FILES['docs']['name']);
        
    $tmpName  $_FILES['docs']['tmp_name'];
        
    $fileSize $_FILES['docs']['size'];
        
    $fileType $_FILES['docs']['type'];

        
    $hdl fopen($tmpName'r');
        
    $content fread($hdlfilesize($tmpName));
        
        
    $content addslashes($content);
        
    fclose($hdl);
        
           
    $fileName strtr($fileName$sql);

        if (
    $_POST['descr']) {
            
    $descr strtr($_POST['descr'], $sql);
            
    $query "INSERT INTO download (nome, file, descr) VALUES ('$fileName', '$content', '$descr')";
        } else
            
    $query "INSERT INTO download (nome, file) VALUES ('$fileName', '$content')";
        
        if (
    mysql_query($query))
        
            
    mysql_query("INSERT INTO auth (nome, pagina) VALUES ('$_SERVER[PHP_AUTH_USER]', '$fileName')");


  2. #2
    Prima di tutto ti consiglio di accertarti che tutti gli errori siano riportati.
    error_reporting(E_ALL);
    Può darsi che l'hai già fatto ma non si sa mai.

    Poi ti consiglio di impostare il tempo limite a 0, cioè nessun tempo limite, con set_time_limit(0);
    Poi ti consiglio di provare ad eseguire ed andare in output con una strlen dei dati binari in modo da accertarti che effettivamente la variabile venga popolata con i byte che invii.

    Se strlen riceve un valore più piccolo hai un problema con l'upload, a monte.
    Se strlen ritorna un valore uguale alla dimensione del file hai un problema a valle.

    Per iniziare è già qualcosa.

    Inoltre vedo che non fai controlli sul file pointer, potrebbe essere impossibile aprire il temporaneo per qualche ragione.

    Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    34
    Per prima cosa grazie!

    ho seguito i suggerimenti e modificato lo script nel seguente modo:
    al posto di [...] è rimasto il codice invariato rispetto a quanto postato prima.
    Codice PHP:
    set_time_limit(0);
    error_reporting(E_ALL);
    [...]    
    $hdl fopen($tmpName'r');
    $content fread($hdlfilesize($tmpName));

    echo 
    strlen($content);

    $content addslashes($content);
    fclose($hdl);
    [...] 
    E_ALL era impostato nel php.ini e non dava ne error, ne warning, ne notice... ne niente di niente! (purtroppo o per fortuna a seconda dei punti di vista)

    la riga echo strlen($content); stampa la dimensione in byte (34235626 in questo caso) del file esattamente come quella che vedo se da esplora risorse faccio tasto destro->proprietà, non un byte in più, non uno in meno, come dovrebbe essere di norma, quindi il problema sembra essere a valle.

    Inoltre vedo che non fai controlli sul file pointer, potrebbe essere impossibile aprire il temporaneo per qualche ragione.
    Posso chiedere quali controlli sarebbe utile fare?

    Se però carico file più piccoli (16179683 byte ~ 15,4Mb) riesco a compiere perfettamente tutte le operazioni necessarie (upload/download/cancellazione)!

    Thanks a lot!!!

  4. #4
    Posso chiedere quali controlli sarebbe utile fare?
    fopen ritorna false in caso non riesca ad aprire il puntatore.
    Per essere pignoli bisognerebbe fare un check e gestire l'errore, comunque hai fatto strlen sui dati caricati dal file, quindi il problema non è sulla lettura del file.

    Da quello che vedo potresti avere altri due problemi.
    Vuoi caricare file da 64MB ma php ha massimo 64MB a disposizione.
    Ma se guardi lo script ti accorgerai che potresti trovarti con una variabile $content di 64MB, che poi vai ad inserire su un altra variabile (la query) che quindi a sua volta avrà bisogno di 64MB + extra.

    Questo è un errore, perchè c'è la possibilità che php non riesca ad allocare abbastanza memoria per terminare lo script.
    Poi noto altri "errori".
    Vedo che prendi parametri get e post e li controlli in modo insufficiente.
    Visto che usi mysql ti consiglio vivamente di usare mysql_real_escape_string che è la funzione specifica per poter inserire tranquillamente una stringa in una query. Anche mysql_escape_string potrebbe risultare insufficiente se si sta utilizzando una codifica particolare per le comunicazioni.
    Questo problema di sicurezza tra l'altro può essere la causa dei tuoi mali.
    In un file binario è molto probabile che prima o poi si incontri un char strano, in grado di mandare in errore la query.

    Con

    $content = " bla bla bla data='".mysql_real_escape_string($content,$dbresou rce)."' bla bla;";

    vai tranquillo.
    Non potrebbe esistere niente di meglio.
    L'unica cosa da tener presente è che mysql_real_escape_string non fa l'escape dei caratteri % ed _.
    Ma quello riguarda i pattern di confronto, non è il caso di un insert, quindi in questo caso non va fatto l'escape.

    Poi ti consiglio di usare la stessa variabile dei dati binari per costruire la stringa come ho fatto nell'esempio sopra.
    Così eviti di istanziare due variabili praticamente identiche che ti occupano memoria per niente.

    Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    34
    ok ok...questo script è un disastro...

    comunque ho provato a metter mano ad alcune cose:

    Vuoi caricare file da 64MB ma php ha massimo 64MB a disposizione.
    In realtà il file che sto caricando (ma è solo per fare delle prove) è di 32,6Mb (34235626 byte per essere pignoli) e comunque portando tutte le quote (memory_limit, post_max_size, upload_max_filesize e max_allowed_packet) a 128Mb non miglioro la situazione.

    Così eviti di istanziare due variabili praticamente identiche che ti occupano memoria per niente.
    Giustissimo...in effetti perché sprecare memoria in questo modo??? Ora utilizzo solamente la variabile $content, ma nonostante ciò nulla cambia.

    [...]ti consiglio vivamente di usare mysql_real_escape_string[...]
    Ok, fatto, ma ancora niente. A riguardo però vorrei chiedere un paio di cose:
    mysql_real_escape_string prende due parametri, la stringa su cui operare e la connessione al database. È giusto usarla così:
    Codice PHP:
    $db mysql_connect($host$user$pwd);
    $content mysql_real_escape_string($content$db); 
    Ho visto sul manuale di php che il secondo argomento è opzionale. Che differenza c'è? Comunque in entrambi i casi ancora non riesco a farlo andare,

    Con

    $content = " bla bla bla data='".mysql_real_escape_string($content,$dbresou rce)."' bla bla;";

    vai tranquillo.
    Ora la variabile $content subisce le seguenti trasformazioni (dal 1° all'ultimo utilizzo che ne faccio):
    Codice PHP:
    $content fread($hdlfilesize($tmpName));
    $content mysql_real_escape_string($content$db);
    $content "INSERT INTO download (nome, file, descr) VALUES ('$fileName', '$content', '$descr')";
    mysql_query($content); 
    Non so se ancora sbaglio qualcosa, perché ancora non funziona...

    Ho notato però che il problema è l'esecuzione di mysql_query perche se metto così:
    Codice PHP:
    if (mysql_query($content)) {
        echo 
    "GOOD!!!";
    } else {
        echo 
    "BAD!!!";

    Mi scrive BAD!!! come previsto. Però non riesco proprio a capire qual'è il problema...
    A questo punto non so se risiede nella formulazione della query (con i relativi problemi di escape e dimensioni) o se c'è qualche altra impostazione che mi limita la dimensione dei dati. Il campo è di tipo LONGBLOB che secondo il manuale mysql può contenere fino a 4 GiB (ben lontano dai 32Mb).

    Ho anche il sospetto di essere in crisi per una scemenza, ma non so come uscirne...ragazzi scusatemi per il casino che sto tirando in ballo e abbiate pietà di me!!!

  6. #6
    Ma figurati, sbagliando s'impara.
    L'importante è che dimostri anche tu di essere pronto a faticare un po' per capire
    Ho divagato un po' su vari punti dello script, sono un po' pignolo lo so.
    Ma quando ho un problema io cerco sempre di risolvere tutte le stranezze che trovo prima.
    Comunque il tuo problema è la query.

    L'uso che fai di mysql_real_bla_bla_escape è corretto
    Ti consiglio di prendere pratica con il manuale che trovi su it.php.net .
    In alto a dx c'è un ottimo form di ricerca. Se cerchi nella lista funzioni puoi trovare qualsiasi funzione ben decritta e documentata in un lampo, senza bisogno di aspettare risposte sul forum.

    Prova a cercare lì, troverai ogni risposta ed anche di più

    Per farti fare un po' di esercizio ti do altre due funzioni da cercare: mysql_errno e mysql_error.
    Vedrai che dopo aver letto queste tre paginette sarai in grado di risolvere autonomamente il problema, sempre che riguardi unicamente php.

    Il manuale è come la bibbia per uno sviluppatore php, anche dopo anni ed anni di utilizzo non si può sperare di ricordare tutte le funzioni e relativo funzionamento

    Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    34
    Per farti fare un po' di esercizio ti do altre due funzioni da cercare: mysql_errno e mysql_error.
    Vedrai che dopo aver letto queste tre paginette sarai in grado di risolvere autonomamente il problema, sempre che riguardi unicamente php.
    Ho fatto i compiti e ciò che ne è uscito è:
    2006: MySQL server has gone away

    sulla pagina relativa del manuale mysql tra i vari errori uno che sembra verificarsi è:
    You also get a lost connection if you are sending a packet 16MB or larger if your client is older than 4.0.8 and your server is 4.0.8 and above, or the other way around.

    infatti mysql_get_client_info mi rerstituisce 3.23.49
    e mysql_get_server_info mi da 4.1.9-max

    da cui si ritorna alla tesi iniziale:
    Server/php/database: EasyPHP 1.8.0.1
    (Scelta discutibile, lo so, ma è tanto comodo...)
    beh alla luce di ciò sembra non essere così comodo come credevo!

    A questo punto non mi resta che ringraziarti infinitamente per il supporto e soprattutto per avermi fatto aprire gli occhi su cose che davo per scontato dovessero funzionare.

    Spero di non abusare della tua pazienza chiedendoti un ultimo (giuro) parere:
    se non erro il server è mysql e il client php giusto?
    a questo punto piuttosto che "regredire" il server ad una versione precedente alla 4.0.8 penso sia meglio aggiornare il client php. Prendo l'ultima versione o ce n'è una più stabile anche se precedente?

    Ancora grazie infinite!


    ps. un giorno (non so quando e non so come) mi sdebiterò!!!

  8. #8

    Vedo che usi lo sforzo ragazzo...
    Aiutare le persone come te è un vero piacere

    Veniamo al dunque.

    Il client di php per mysql dovrebbe essere determinato dal file mysql*.dll che viene caricato tramite il php.ini.
    Su linux invece ho il dubbio che dipenda dal client vero e proprio che risiede sul sistema.
    Ad ogni modo su windows non ho mai provato a sostituire dll con quelle di altre release. Credo che il risultato sia tutt'altro che garantito.
    A questo punto, se non funziona, dovresti aggiornare php.
    Personalmente io uso sempre l'ultima versione, sia di php, che di mysql (debian unstable) e trovo che anche per la produzione comune sono sufficientemente stabili.
    Però, se aggiorni a php5 potrebbero crearsi altre frizioni, anche se non ne sono certo, per via di mysql4.
    Io installerei l'ultima release di php4, ma non posso darti certezze perchè è un consiglio untested

    Nel caso volessi reinstallare tutto, o per le prossime installazioni, mi permetto di darti un consiglio.
    Lascia perdere quelle schifezze
    Installa apache, mysql e php separatamente, magari all'ultima versione.
    Mysql è autonomo, apache anche.
    L'unica cosa che devi configurare è php sotto apache (tutto perfettamente documentato nel file install.txt contenuto nello zip di php) e mysql su php (basta decommentare la voce).
    A volte windows può rompere le scatole. Basta copiare i file .dll dei moduli di php nelle cartelle /windows e /windows/system32/, un riavvio, ed è tutto ok.
    Tempo medio di installazione, 15min

    Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    34
    Aiutare le persone come te è un vero piacere
    Adesso esageri, però



    sostituire dll con quelle di altre release. Credo che il risultato sia tutt'altro che garantito.
    Anch'io la considero una follia, l'idea era di sostituire l'intero php lasciando inalterati apache e mysql!

    Comunque credo che seguirò il consiglio
    Lascia perdere quelle schifezze
    e installerò le tre parti separate.
    A dir la verità l'avevo già fatto, poi, preso da forte pigrizia, ho ceduto e installato quelle schifezze perché sono necessari mediamente 15secondi...
    Durante il week-end provvederò ad aggiornare il sistema!


    Che dire... sei stato troppo gentile!!!

    IroN@xiD 4 president!!!

    se potessi ti offrirei una birra...per ora accontentati di

  10. #10
    Sei il mio utente preferito!!

    Chi non buxa non guxa, chi no gira no ghe tira, chi no leca no steca!
    Salute a te, un brindisi a php!
    Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.