Dateiupload mittels HttpClient

Merlin

Mitglied
Hallo Leute,
und schon mal danke fürs durchlesen.

Ich bin grad dabei über den httpClient einen Upload auf eine Website zu programmieren. Dabei bin ich auf zwei unterschiedliche Seitentypen gestoßen. Die einen rufen eine andere .php Seite auf, was ich problemlos mit java simulieren kann, indem ich die Seite mit den nötigen Inputs (mittels PostMethod) aufrufe.

Leider würde ich gern auf eine ganz bestimmte Website (nPage) meine Daten hochladen. Diese Seite gehört zu den Seiten, die ,nachdem der Benutzer auf den Upload Button geklickt hat, ein Javascript mittels onSubmit aufrufen. Wenn ich nun die Website per Programm aufrufe und die nötigen Inputs übergebe, bekomme ich als Antwort zwar, dass der Server die Anfrage bekommen hat, aber sonst ist sie leer. ("Upload complete, response=")

Mein verwendeter java Code:

Java:
        url ="http://upload.npage.de/upload.php";
        PostMethod filePost = new PostMethod(url);
        
        filePost.getParams().setBooleanParameter(
                HttpMethodParams.USE_EXPECT_CONTINUE,
                false); // true, wenn passender header
        
        try {

        	Part[] parts = {new StringPart("submit", "Gewählte Dateien hochladen"), new StringPart("APC_UPLOAD_PROGRESS", "18f1cee7759a5639371e519b9e622061" ), new FilePart("dateien[]", file)};
        	filePost.setRequestEntity(
                    new MultipartRequestEntity(parts, 
                    filePost.getParams())
                    );
            
            HttpClient client = new HttpClient();
            client.getHttpConnectionManager().
                    getParams().setConnectionTimeout(5000);
            
            int status = client.executeMethod(filePost);
            
            if (status == HttpStatus.SC_OK) {
                System.out.println(
                        "Upload complete, response=" + 
                        filePost.getResponseBodyAsString()
                        );
            } else {
            	System.out.println(
                        "Upload failed, response=" + 
                        HttpStatus.getStatusText(status)
                        );
            }
        } catch (Exception ex) {
        	System.out.println("Error: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            filePost.releaseConnection();
        }

Hier der Ausschnitt aus dem Quellcode der Seite, wo ein Druck auf den "Gewählte Dateien hochladen" Button behandelt wird (Das ist auch noch ein Probelm für mich, da dort das ä als wä geschrieben ist und ich nicht weiß, ob ich nun "Gewählte Dateien hochladen" oder "Gewählte Dateien hochladen" übergeben muss. Habe aber beides probiert ...).

HTML:
 <form enctype="multipart/form-data" onSubmit="startProgress('18f1cee7759a5639371e519b9e622061');" target="upload_frame" action="upload.php" method="POST" style="margin:0px;">
<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="18f1cee7759a5639371e519b9e622061">
<script language="JavaScript" type="text/javascript">

var num_fields = '1';
var save = '';

function add_field(objid){
	var clone_me = document.getElementById(objid).firstChild.cloneNode(true);
	document.getElementById(objid).appendChild(clone_me);
}

function remove_field(objid){
	var delete_me = document.getElementById(objid).lastChild;
	document.getElementById(objid).removeChild(delete_me);
}

function fields(objid, num) {
	var num_buf = num;

	if (num - num_fields > 0) {
		for (var num; num > num_fields; num--) {
			add_field(objid);
		}

		num2 = num_buf - 1;

		for (var num2; num2 >= num_fields; num2--) {
			document.forms[0].elements[num2+1].value = '';
		}
	}
	else {
		for (var num; num < num_fields; num++) {
			remove_field(objid);
		}
	}

	num_fields = num_buf;
}
</script><table border="0" cellpadding="3" cellspacing="0" class="tabelle1" width="100%"><tr><td align="center" style="text-align: center;"><a href="javascript:fields('uploads', 1);" onfocus="blur(this)">1 Datei</a> | <a href="javascript:fields('uploads', 3);" onfocus="blur(this)">3 Dateien</a> | <a href="javascript:fields('uploads', 5);" onfocus="blur(this)">5 Dateien</a> | <a href="javascript:fields('uploads', 10);" onfocus="blur(this)">10 Dateien</a> | <a href="javascript:fields('uploads', 20);" onfocus="blur(this)">20 Dateien</a></td></tr></table>

<table border="0" cellpadding="3" cellspacing="0" class="tabelle1" width="100%" style="margin-bottom: 0px; padding-bottom: 0px; border-bottom: 0px;"><tr><td colspan="2" class="titel">Formular</td></tr></table><table id="uploads" border="0" cellpadding="3" cellspacing="0" width="100%" class="tabelle1" style="margin-bottom: 0px; padding-bottom: 0px; border-bottom: 0px; border-top: 0px;"><tr><td width="160" nowrap="nowrap"><b>Datei:</b></td><td><input type="file" size="25" name="dateien[]"></td></tr></table><table border="0" cellpadding="3" cellspacing="0" width="100%" id="uploads" class="tabelle1" style="border-top: 0px;"><tr><td width="160">&nbsp;</td><td>&nbsp;<a href="javascript:fields('uploads',(num_fields+1));" onfocus="blur(this)" style="padding-top: 0; margin-top: 0;">Eine weitere Datei hochladen ...</a><br><br><input type="checkbox" class="checkbox" name="compress_now" id="compress_now" value="1" checked> <label for="compress_now">Hochgeladene Bilder automatisch komprimieren (empfohlen)</label></td><tr><td>&nbsp;</td><td><input type="submit" value="Gew&auml;hlte Dateien hochladen" class="form-button"></td></tr></table><input type="hidden" name="act" value="upload">
</form>

Leider bin ich mir inzwischen nicht einmal mehr sicher, ob das überhaupt per HttpClient geht und ich nicht HtmlUnit hernehmen muss ...

Wenn ich bloß dieses onSubmit irgendwie aufrufen könnte ...

Freue mich über jeden Ratschlag!

mfg Merlin
 
Das, was ich da rauslese ist einmal eine Art UID, mit der JavaScript wahrscheinlich per AJAX den Server während der Uploads abfragt, wieviel schon angekommen ist. Dann noch Code, um im DOM für jede Datei ein Auswahlfeld einzubauen.

Alles in allem solltest Du den JavaScript-Krempel erst mal ignorieren und letztendlich den Traffic mit wireshark mitschneiden. Dann per "Follow TCP-Stream" schauen, was da genau übertragen wird und welche Kennungen die MultiPartForm-Teile haben und wohin der Redirect geht, wenn alles da ist.

Ist diese Bilderseite öffentlich zugänglich?
 
Hi,
und danke für die schnelle Antwort.

Leider ist nPage eine Website, wo sich eine Hompage erstellen kann, und deshalb ohne (kostenlose) Registrierung nicht zugänglich.

Von wireshark hatte ich noch nicht gehört, aber ich werde mich im Laufe des Tages damit beschäftigen.

mfg Merlin
 
Hi,
Vielen Dank kay73.

Mittels wireshark hab ich, die Post und Get Methode vom Firefox mit dem von meinem Programm verglichen. Dabei bin ich darauf gestoßen, dass Firefox ein Cookie mit übermittelt, dass ich dann durch
Java:
 filePost.setRequestHeader("Cookie", "PHPSESSID=*****");
eingefügt hab.

Daraufhin hat alles geklappt 😀.

mfg Merlin
 

Zurück
Oben