Visualizzazione dei risultati da 1 a 9 su 9

Discussione: upload file error

  1. #1

    upload file error

    Ciao a tutti. Ho installato Ubuntu 20.04 ed ora il mio script non funziona piu. Funziona su Ubuntu 19.10. Ma sulla nuova versione di Ubuntu, senza far alcuna modifica allo script, la configurazione di PHP mi blocca l'update dei file con l'errore :
    411 Length Required : A request of the requested method POST requires a valid Content-length.

    Non so cosa fare, potete aiutarmi ? Grazie

    Codice PHP:
    function sendFile2Server($nomefile,$codice,$anno){        global $ip;    $args1['file'] = new CurlFile($nomefile'image/png');    $args1["path"] = "SCANNER";    $ch curl_init();    curl_setopt($chCURLOPT_URL"http://$ip/vinaccia/vina_receive_scansione.php");    curl_setopt($chCURLOPT_HEADERfalse);    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);    curl_setopt($chCURLOPT_POSTtrue);    curl_setopt($chCURLOPT_POSTFIELDS$args1);        $result curl_exec($ch);    curl_close($ch);        return $result;    } 

  2. #2
    Ho provato ad eseguire dal terminale di Ubuntu il seguente comando curl :
    codice:
    curl -X POST -F "file=@MVV11200.pdf" -F "path=SCANNER" -F "codice=4" -F "anno=2020" http://192.168.1.69:8420/vinaccia/vina_receive_scansione.php
    E funziona.

    Il problema risiede solo eseguendo la funzione in PHP.

    Un aiutino....please

  3. #3
    Riscrivo il codice perché era impaginato in modo illeggibile nel primo messaggio.

    codice:
    function sendFile2Server($nomefile,$codice,$anno) {
        global $ip;    
        $args1['file'] = new CurlFile($nomefile, 'image/png');    
        $args1["path"] = "SCANNER";    
        $args1["codice"] = "4";    
        $ch = curl_init();    
        curl_setopt($ch, CURLOPT_URL, "http://$ip/vinaccia/vina_receive_scansione.php");    
        curl_setopt($ch, CURLOPT_HEADER, false);    
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
        curl_setopt($ch, CURLOPT_POST, true);    
        curl_setopt($ch, CURLOPT_POSTFIELDS, $args1);        
        $result = curl_exec($ch);    
        curl_close($ch);        
        return $result;    
    } 
    I parametri sono giusti, e vi ripeto che il codice della funzione è corretto perché su un altro computer con Ubuntu 19.10 funziona perfettamente.
    Il server all'indirizzo IP risponde correttamente.
    C'è una sorta di configurazione da settare che non capisco...
    Da cosa può dipendere secondo voi ?
    Grazie mille

  4. #4
    Utente di HTML.it L'avatar di ninja72
    Registrato dal
    May 2020
    residenza
    -
    Messaggi
    319
    Sembra che il problema sia riferito all'omissione di alcuni parametri dell'header ma posso dare un conferma al 100%.


    Ti potrei dire ci fare delle prove inserendo appunto i dati dell'header, in una situazione simile a questa:

    codice:
    function sendFile2Server($nomefile, $codice, $anno)
    {
    
        global $ip;
        $args1['file'] = new CurlFile($nomefile, 'image/png');
        $args1["path"] = "SCANNER";
        $args1["codice"] = "4";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "http://$ip/vinaccia/vina_receive_scansione.php");
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $args1);
        $result = curl_exec($ch);
        header('Cache-Control: public');
        header('Content-type: application/pdf');
        header('Content-Disposition: attachment; filename="' . $nomefile . '"');
        header('Content-Length: ' . strlen($result));
        curl_close($ch);
        return $result;
    }

  5. #5
    Grazie ninja72, ho provato ma per ogni riga dell'header ottengo questo errore :

    codice:
    Cannot modify header information - headers already sent

  6. #6
    Aggiungo inoltre una cosa:
    Anche se nella mia funzione aggiungo le informazioni dell'header con :
    codice:
    curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/json','Content-length:'.strlen(json_encode($args1))));
    l'errore resta.
    Se uso curl_getinfo($ch) per verificare, le informazioni che invio dell'header vengono scartate. Difatti mi dice :
    codice:
     ["content_type"]=>  string(24) "text/html; charset=UTF-8"
    Se non aggiungo nei parametri il file da spedire al server, tutto funziona bene. Ho provato anche a cambiare tipo di file, ma l'errore si verifica solo se tento di fare l'upload di un file.
    Piu che un errore di codice (visto che cmq la funzione � eseguita correttamente su un altro pc), credo sia un problema di configurazione o di PHP o di APACHE2. Ma non ho idea di dove guardare...
    Suggerimenti ?

  7. #7
    Utente di HTML.it L'avatar di ninja72
    Registrato dal
    May 2020
    residenza
    -
    Messaggi
    319
    Potresti verificare se il pacchetto è installato su ubuntu 20.04, restartando poi il server apache, solitamente si possono verificare le impostazioni anche dal php.ini :

    sudo apt-get install php-curl


    comunque forse il passaggio delle header in curl va fatto utilizzando :
    Codice PHP:
    $headers = array(
                        
    'Content-type: application/pdf',
                        
    'Content-Length: ' strlen($result)
                    );
    curl_setopt($chCURLOPT_HTTPHEADER$headers); 

    non ho avuto tempo si testare la cosa, le mie sono solo informazioni che spero ti possano aiutare con il tuo problema.

  8. #8
    Grazie di nuovo, ma avevo già provato entrambe le cose, e non ottengo nulla di diverso.

    Quello che posso dire è che la funzione curl di php funziona.
    SOLO se decido di passare come parametro un FILE ottengo l'errore.
    Il server funziona perché se eseguo curl (senza PHP) dal terminale di Ubuntu, l'upload del file avviene senza problemi.

    Nel php.ini ho verificato che file_uploads sia On.

    Non mi viene in mente piu nulla.

    Devo eliminare php7.4 e tornare ad usare una versione precedente ?
    Ultima modifica di grappale; 15-08-2020 a 08:57

  9. #9
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    secondo me, l'errore sta qui
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args1)

    sei sicuro che la chiave "file" di $args1 contenga realmente i dati che ti aspetti?

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    189
    Devi impostare un header solo se non è presente alcun output (spazi bianchi dopo la chiusura di php, BOM unicode e funzioni che stampano o ritonano output
    su schermo come ad esempio echo, var_dump, print etc. altrimenti ricevi l'errore Cannot modify header information - headers already sent.
    Se il valore del terzo parametro di CURLOPT_POSTFIELDS è array avrai Content-Type: multipart/form-data comunque il nome è CURLFile prova anche inserendo il suo terzo parametro postname. Un'esempio qui https://www.php.net/manual/en/curlfile.construct.php e il relativo output di $_FILES.
    Tuttavia con HTTP/2 l'errore per il Content-Length con Transfer-Encoding: chunked è qui contemplato e risolto da php 7.4.4 o successivo (almeno sembra).
    https://bugs.php.net/bug.php?id=79013
    Ultima modifica di darbula; 16-08-2020 a 13:39

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 © 2024 vBulletin Solutions, Inc. All rights reserved.