Announcement

Collapse
No announcement yet.

Über NMHTTP->Get Datei downloaden [Problem]

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Über NMHTTP->Get Datei downloaden [Problem]

    Servus!

    Ich habe ein Problem mit der NMHTTP-Komponente in Borland. Ich möchte eine Datei von (m)einem Webserver laden über HTTP und nicht über FTP.

    Body = "C:\directory\file.txt";
    InputFileMode = true;
    OutputFileMode = false;
    // ----------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    NMHTTP1->Get("www.hostname.de/file.txt");
    }

    void __fastcall TForm1::NMHTTP1Success(CmdType Cmd)
    {
    Application->MessageBoxA("NMHTTP1Success","",0);
    }

    void __fastcall TForm1::NMHTTP1AuthenticationNeeded(TObject *Sender)
    {
    Application->MessageBoxA("NMHTTP1AuthenticationNeeded","",0) ;
    }
    Nun erstellt dasProgramm in "C:\directory\" die Datei "file.txt" aber sie ist leer. Somit vermute ich, dass er den Inhalt der Datei "file.txt" vom Server runtergeladen hatt, aber nicht in der Datei "file.txt" auf dem PC gespeichert hat.

    Woran liegt das, was habe ich falsch gemacht?

    Des Weiteren habe ich auf einer Subdomain (m)eines Webservers den Bereich via .htaccess geschützt. Somit würde ich die die herunterzuladende Datei folgendermaßen downloaden:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    NMHTTP1->Get("Userid:[email protected]/file.txt");
    // oder
    // NMHTTP1->Get("http://www.Userid:[email protected]/file.txt");
    }
    Nach dem Kompilieren und dem Drücken des "Buttons1Click" erscheint folgende Fehlermeldung:

    Project Project1.exe raised exception class EConvertError with message ''Userid:[email protected]' is not a valid integer value'. Process stopped. Use Step or Run to cuntinue
    Ich bin ratlos, und freue mich über jede Lösung!

    Gruß!
    Ants aren't dead

  • #2
    Hi,

    du könntest ja mal Folgendes probieren:

    Code:
    http://Userid:[email protected]/file.txt
    Wenn ich mich nicht irre, wird in deinem Quelltext oben gar nicht gezeigt, wie du die Datei speicherst. Versuche doch mal den Inhalt der heruntergeladenen Datei auszugeben. Dann kannst du den Fehler weiter eingrenzen.
    Zuletzt editiert von Novi; 08.11.2009, 12:21.
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Generell unterstützt Borland nicht mehr die NMHTTP Komponenten. Von deren Nutzung ist abzuraten

      Ersatz sind die Indy-Komponenten.

      Für Problen Nr.1 würde sich

      http://www.marquardtnet.info/cecke/q...quicky_44.html

      als Ersatz anbieten.

      Dort gibt es einen AuthenticationManager der Problem Nr.2 lösen sollte
      Christian

      Comment


      • #4
        Ok, werde ich mir mir ansehen und ausprobieren. Falls Probleme auftreten sollen, meld ich mich wieder

        Danke schön erstmal
        Ants aren't dead

        Comment


        • #5
          Servus!

          Hab es nun mit der Indy-Komponente realisiert. Das klappt auch so, wie ich mir das vorstelle, zu mindest mit Textdateien.
          Warum nutzt man denn nicht mehr die NMHTTP, bzw warum gibt es diese noch?


          Wenn ich mir nun den String ausgeben lasse (den Inhalt der Textdatei) erscheint überall dort, wo ein Zeilenumbruch ist ein " | ". Hat das was mit ANSII und UTF-8 zu tun?? Wenn ich nun eine nicht-Textdatei, also zip oder exe, ... runterladen möchte und diese logischerweise auf der Platte speichern möchte, wie realisiere ich das? Reicht es den heruntergeladenen String einfach in eine datei zu schreiben?


          TStringList *tsl_DatOut = new TStringList();
          tsl_DatOut->Add(IdHTTP1->Get("http://www.atf.dg-soundesign.de/data/test.txt");
          tsl_DatOut->SaveToFile("file.exe");

          Wohl kaum...
          Ants aren't dead

          Comment


          • #6
            Dann darfst du das nicht in einen String lesen, sondern in einen Speicherbereich und diesen dann abspeichern.. wenn das mit Get geht....
            Christian

            Comment


            • #7
              Wie in einen Speicherbereich legen? Ich kenne es nur so, dass ich wenn ich irgendwas zwischenspeichern will das ganze in nen String, int,... oder ne TStringList speicher...
              Ich wüsste nicht wie ich die heruntergeladenen Daten in nen Speicherbereich legen kann.
              Ants aren't dead

              Comment


              • #8
                Du kannst keine Binärdaten in etwas vom Typ String speichern....
                Christian

                Comment


                • #9
                  Code:
                  	TMemoryStream *MemoryStream = new TMemoryStream;
                  
                  	AnsiString Url = "http://www.atf.dg-soundesign.de/data/test.txt";
                  
                  	AnsiString FileName = ExtractFilePath(ParamStr(0)) + "test.txt";
                  
                  	try
                  			{
                  			   IdHTTP->Get ( Url, MemoryStream  );
                  			   
                  			  // Speichern
                  			   MemoryStream->Position = 0;
                  			   MemoryStream->SaveToFile ( FileName );
                  
                  			  // Oder in ein TMemo laden
                  			   MemoryStream->Position = 0;
                  			   Memo1->Lines->LoadFromStream ( MemoryStream );
                  			}
                  	catch ( Exception &exception )
                  		{
                  
                  		}
                  
                  	delete MemoryStream;

                  Comment


                  • #10
                    Servus!
                    Ja, das klappt. Wieder was gelernt, dankeschön!

                    Aber gibt es nicht auch eine schönere Methode als mit try & catch??

                    Grüße!
                    Ants aren't dead

                    Comment


                    • #11
                      Aber gibt es nicht auch eine schönere Methode als mit try & catch??
                      Warum ist diese nicht schön?
                      Christian

                      Comment


                      • #12
                        In der Entwicklungsphase nerven die Programmabbrüchedurch Borland, wenn der try-Block nicht ausgeführt werden kann.
                        Ants aren't dead

                        Comment


                        • #13
                          Das kann man einstellen....Während der Entwicklungsphase wird in der Grundeinstellung jede Exception geworfen
                          Christian

                          Comment


                          • #14
                            Wie verkette ich denn am besten Strings?

                            Ich kenne nur strcpy / strcat

                            und das mit dem " + Operator"



                            MemoryStream->SaveToFile(Edit6->Text + "\\" + ListBoxResult->Selected[a] );

                            Dabei sagt der mir: 'operator+' not implemented in type 'AnsiString' for arguments of type bool

                            Muss ich nun die Strings vorher zusammenfügen? Und wenn ja wie macht man das am besten?

                            Ach ja, wenn ich das vorher mache kommt die selbe Fehlermeldung
                            Ants aren't dead

                            Comment


                            • #15
                              strcpy / strcat
                              ..kommt aus der reinen C/C++ und ist für den Datentyp char gedacht. Sie sind nicht für die Arbeit mit der Klasse String/AnsiString.
                              Hier wird der + Operator genutzt.

                              Fehler wird vermutlich sein, dass ListBoxResult->Selected[a] einen boolschen Wert zurückgibt, der angibt, ob das Element selektiert ist. Der boolsche Wert kann natürlich nicht so ohne weiteres zu einem String hinzugefügt werden
                              Zuletzt editiert von Christian Marquardt; 10.11.2009, 11:25.
                              Christian

                              Comment

                              Working...
                              X