Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Delphi] Indy, upload e download

    Buongiorno a tutta la comunità.
    La mia necessità è quella di inviare un file che dovrebbe essere elaborato e quindi scaricare il risultato di questa elaborazione. Tutto questo è previsto e funzionante infatti la procedura è già utilizzata tramite codice java.
    Io però devo farlo in Delphi e per questo utilizzo il componente IdHTTP insieme a IdSSL.
    Mi è stato passato il codice Java e ho provato a tradurlo in Delphi, la sequenza operativa dovrebbe essere la seguente:
    1. Utilizzando user e password richiedo un token
    2. Tramite il token che mi viene restituito effettuo un'altra richiesta inviando un file
    3. La risposta dovrebbe contenere un altro file che viene generato tramite una elaborazione eseguita in remoto

    Ora il punto 1 (la richiesta del token) funziona e anche il punto 2 sembrerebbe funzionare, ma il punto 3 non mi restituisce nulla: forse sbaglio ad inviare il file? Forse non arriva nulla? Sicuramente sbaglio qualcosa e vorrei sottoporvi la porzione di codice Java che funziona ed il codice Delphi che ho scritto.
    La funzione Login, che richiede il token credo che funzioni, quella che non va è la procedura InviaRiceviFile.

    Vi sarò grato se potrete (e vorrete) darmi qualche suggerimento, qualche spunto, qualunque cosa mi aiuti a superare questo blocco.
    Grazie a tutti.

    Codice Java:
    codice:
    public class testAuthFunction{
        private static final String functionUri = <indirizzo del portale che riceve ed invia i file>;
        private static final String tokenUri = <indirizzo del portale che riceve credenziali e genera il token>;
        private static final String tokenToAskForAToken = <b64 di username:password>;
    
    
        private static final String bdapFilePath = "F:\\BDAP_C_2020.zip"; //file di input
        private static final String bdapZipFilePath = "F:\\tmp\\XBRL_BDAP_C_2020.zip"; //file di output
        
        public static void main( String[] args ) throws Exception {
            
            try{
                
                //prova di chiamata
                CloseableHttpClient httpClient = HttpClients.createDefault();
                HttpPost uploadFile = new HttpPost(functionUri);
                uploadFile.addHeader("Authorization", authExplicit());
                MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    
    
                // Attacco il file al post
                File f = new File(bdapFilePath);
                builder.addBinaryBody(
                    "file",
                    new FileInputStream(f),
                    ContentType.APPLICATION_OCTET_STREAM,
                    f.getName()
                );
    
    
                HttpEntity multipart = builder.build();
                uploadFile.setEntity(multipart);
                //spedisco la richiesta 
                CloseableHttpResponse response = httpClient.execute(uploadFile);
                HttpEntity responseEntity = response.getEntity();
                
                File zip = new File(bdapZipFilePath); 
                OutputStream responseOutputStream = new FileOutputStream(zip);
                
                responseEntity.writeTo(responseOutputStream);
                responseOutputStream.close();
                
                //fine prova di chiamata
                
            }catch (IOException ieo){
                ieo.printStackTrace();
            }
        }
        static String authExplicit() throws IOException {
    
    
            String token = null;
            
            try{
                
                //prova di chiamata
                CloseableHttpClient httpClient = HttpClients.createDefault();
                HttpPost askToken = new HttpPost(tokenUri);
                //aggiungiamo tutti gli header di Ivan
                askToken.addHeader("Authorization", "Basic " + tokenToAskForAToken);
                askToken.addHeader("Content-Type", "application/x-www-form-urlencoded");
                //askToken.addHeader("Content-Length", "29");
                
                HttpEntity body = new StringEntity("grant_type=client_credentials");
                          
                askToken.setEntity(body);
                //spedisco la richiesta 
                CloseableHttpResponse response = httpClient.execute(askToken);
                HttpEntity responseEntity = response.getEntity();
                
                //stampo la risposta
                
                System.out.println("HEADER");
                for (Header mioheader : response.getAllHeaders()) {
                    System.out.println(mioheader.toString());
                }
                
                System.out.println("CONTENT");
                token = IOUtils.toString(responseEntity.getContent(),"UTF-8");
                System.out.println(token);
                //tiro fuori cosi il token, dovrei prendermi il campo access token
                token = token.substring(17, token.indexOf("\",\"expires_in\""));
                System.out.println(token);        
                
            }catch (IOException ieo){
                ieo.printStackTrace();
            }
            return "bearer " + token ;
        }
        
    }
    Codice Delphi:
    codice:
    function Login: string;
    const
      tokenUri = <https del portale che riceve credenziali e genera il token>;
      tokenToAskForAToken = 'dGVzdEJkYXA6b3dtR0N3aU15cmhWb0VScG55azNEOHIyOHhGNGc3cG4=';
    var
      Params: TStringList;
      Token: string;
    begin
      Result := '';
      IdHttp1.Request.CustomHeaders.AddValue('Authorization', 'Basic ' + tokenToAskForAToken);
      IdHttp1.Request.CustomHeaders.AddValue('Content-Type', 'application/x-www-form-urlencoded');
      Params := TStringList.Create;
      try
        try
          Params.Add('grant_type=client_credentials');
          Token := IdHTTP1.Post(tokenUri, Params);
          Memo1.Lines.Add(Token);
          Result := 'bearer ' + Token
        except
          on E:Exception do
            Memo2.Lines.Add(E.Classname + ': ' + E.Message);
        end;
      finally
        Params.Free;
      end;
    end;
    
    
    procedure InviaRiceviFile;
    const
      functionUri = <https del portale che riceve ed invia i file>;
      bdapFilePath = 'c:\temp\BDAP_P_2022.zip'; //file di input
      bdapZipFilePath = 'c:\temp\XBRL_BDAP_P_2022.txt'; //file di output
    var
      Params: TIdMultiPartFormDataStream;
      Response: TMemoryStream;
    begin
      idhttp2.Request.BasicAuthentication := True;
      IdHttp2.Request.CustomHeaders.Values['Authorization'] := Login;
    
    
      Params := TIdMultiPartFormDataStream.Create;
      Response := TMemoryStream.Create;
    
    
      try
        try
          Params.AddFormField('file', bdapFilePath, 'application/octet-stream');
          IdHttp2.Post(functionUri, Params, Response);
          Response.SaveToFile(bdapZipFilePath);
        except
          on E:Exception do
            Memo2.Lines.Add(E.Classname + ': ' + E.Message);
        end;
      finally
        Params.Free;
        Response.Free;
      end;

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Proverei a sostituire questa istruzione:
    codice:
    Params.AddFormField('file', bdapFilePath, 'application/octet-stream');
    con questa:
    codice:
    Params.AddFile('file', bdapFilePath);
    Se il problema non viene risolto, può essere conveniente diagnosticare anche lato Java quello che viene ricevuto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Ciao e grazie della risposta.
    Hai centrato il problema, va usato:
    codice:
    Params.AddFile('file', bdapFilePath)
    ma mi sono accorto anche che è sbagliato il parametro BasicAuthentication che deve essere settato così:
    codice:
    Request.BasicAuthentication:=False
    e non ho ancora capito perché, infatti ci sono arrivato per tentativi

    Grazie ancora!
    Ultima modifica di ASavaglio; 27-04-2023 a 17:10

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.