Zum Inhalt springen

Dateidownload mit Benutzeranmeldung und https


Empfohlene Beiträge

Geschrieben

Hallo Forum,

ich habe unter MS Excel eine VBA Anwendung geschrieben die in der Lage ist automatisiert eine Datei zu laden.

Für den, den es interessiert:

Ich will mit dem Programm automatisiert einen Abgleich zwischen zwei webbasierten Anwendungen durchführen. Gedacht ist das ich mit mittels eines Commandlinetools den Inhalt eines bestimmten Feldes hole in dem die URL der Datei aus Anwendung 2 steht. Dann Lade ich mir die Datei Auf die HDD und lade es mit der CLI an die korrekte Position in Anwendung 1.

Hier der Codeschnipsel aus VBA für den Download


    Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")

    Dim Buffer() As Byte 

    Dim Buffer2 As String 


     With objXMLHTTP

        .Open "GET", strDateiadresse, True, strUserName, strPassword

        .send


        'Wait for request to finish

        Do While objXMLHTTP.readyState <> 4

            DoEvents

        Loop


        Buffer = .responseBody

        Buffer2 = .getAllResponseHeaders()

    End With


Wie zu sehen wird mittels eines xmlhttp_get die URL zusammen mit dem Benutzernamen und dem Passwort an den Server übertragen. Dann warte ich bis die Anfrage fertig ist und lese die Antwort in ein ByteArray.

Das Funktioniert auch total Super aber ich möchte jetzt mit meinem Code der etwas unnötiger weise in Excel verankert ist ganz gerne ein eigenständiges Modul erstellen.

Der Gedanke dabei ist das man das Modul dann Automatisiert starten lässt und den Overhead der durch Excel erzeugt wird etwas reduziert. Vorzugsweise wollte ich nun die Anwendung in Java umsetzen. Das Commandlinetool lässt sich auch schon Komfortabler ansprechen als aus VBA heraus aber mit dem Download hab ich noch Probleme.

Den Download einer Datei die NICHT hinter der Benutzeranmeldung liegt bekomme ich hin. Allerdings schaffe ich es nicht mich an Anwendung 2 anzumelden...

Hat einer eine gute Idee? Ich bin für jeden Ratschlag dankbar :)

Gruß

Oggie85

Geschrieben

Das ist zur zeit mein aktueller stand...


import java.io.DataInputStream;

import java.io.FileOutputStream;

import java.net.Authenticator;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.Properties;


public class test001 {

	public static void main(String args[])


	{

		dump("http://www.yahoo.com");

		System.out.println("**************");

		dump("https://www.paypal.com");

		System.out.println("**************");

		dump("https://my-url.xy");

		System.out.println("**************");		

	}


	public static void dump(String URLName) {


		Authenticator.setDefault(new MyAuthenticator());


		try {

			DataInputStream di = null;

			FileOutputStream fo = null;


			String proxy = "my-company.proxy.de";

			String port = "8080";

			String userPw = "user.name:password";


			byte[] b = new byte[1];


			// PROXY

			Properties systemSettings = System.getProperties();

			systemSettings.put("http.proxyHost", proxy);

			systemSettings.put("http.proxyPort", port);


			URL u = new URL(URLName);

			HttpURLConnection con = (HttpURLConnection) u.openConnection();

			//	HttpURLConnection.setFollowRedirects(true);

			//	con.setInstanceFollowRedirects(false);


			//Base64Coder encoder = new Base64Coder();

			String encodedUserPwd = Base64Coder.encode(userPw.getBytes());

			con.setRequestProperty("Proxy-Authorization", "Basic " + encodedUserPwd);


			// PROXY ----------

			di = new DataInputStream(con.getInputStream());

			while (-1 != di.read(b, 0, 1)) {

				System.out.print(new String();

			}

		}

		catch (Exception e) {

			e.printStackTrace();

		}

	}

}

[/code]


Gebe ich nur die Basis-URL ein sehe ich zumindest schon mal den HTML-Code. Gebe ich aber die 

Adresse zu dem Download an, bekomme ich folgenden Fehler:

[code] java.net.ProtocolException: Server redirected too many times (20) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1323) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318) at test001.dump(test001.java:55) at test001.main(test001.java:17)

Im Internet habe ich dazu gefunden das es einen Redirect gibt der nicht automatisch verfolgt wird. Die

Lösung dazu ist der Auskommentierte teil

HttpURLConnection.setFollowRedirects(true);

con.setInstanceFollowRedirects(false);

Lass ich mir aber die URL, der ich folgen soll, ausgeben con.getHeaderField("Location")ist es eine

interne Adresse des Zielsystems (http://123.456.78.90:8080)

Ich drehe mich jetzt etwas im Kreis... Ursprünglich wollte ich das mittels XMLhttpRequest

(HttpClient - HttpClient Home) lösen in der Hoffnung, dass ich die Klasse in etwa so benutzen könne

wie die Implementierung unter VBA. Dies zeigte sich aber als komplizierter als erwartet...

Jetzt habe ich den Gedanken gehabt, dass ich den Download mit Java-Boardmitteln lösen könne.

Komme aber mit dem obigen Code auch nicht weiter...

Hat hier noch jemand einen guten Gedanke?

Gruß

Oggie85

  • 2 Wochen später...
Geschrieben

So habs hinbekommen...

ich habe nach einem alternativen Package gesucht und bin dabei auf httpunit (HttpUnit Home) gestoßen. Dieses Package ist SEHR interessant wie ich finde...

Naja ich konnte meinen Donwload somit wie folgt lösen:


private static void downloadFiel(String path, String link) {


		// create the conversation object 

		WebConversation wc = new WebConversation();

		// Proxy

		wc.setProxyServer(Proxy, ProxyPort);

		// Authentication

		wc

				.setAuthentication(realm, User,

						UserPass);

		// Obtain next page

		WebRequest request = new GetMethodWebRequest(link);

		WebResponse response = null;



		float contentLength = response.getContentLength();


		// get all links on this page

		InputStream di = null;

		try {

			di = response.getInputStream();

		} catch (IOException ioe) {

			log.error(ioe);

		}


		FileOutputStream fo = null;

		try {

			fo = new FileOutputStream(path);

		} catch (FileNotFoundException e) {

			DownOmat.log.error(e);

		}


		byte[] b = new byte[1];

		try {

			// write the file byte wise

			while (-1 != di.read(b, 0, 1)) {

				fo.write(;

			}

		} catch (IOException e) {

			log.error(e);

		}

		try {

			fo.close();

		} catch (IOException e) {

			log.error(e);

		}

		// Clear all request...

		wc.clearContents();

		response.close();


	}

[/code]

Gruß

Oggie85

PS.: Problem geklärt, kann geschlossen werden.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...