Moin!
Gibt es nicht mit vorhandenen Mitteln eine Möglichkeit, ein Formular mit eingebetteter Datei aufzubauen, die zu einer korrekt aufgebauten Multipart-Message führt?
Nein, denn deine Möglichkeiten sind nun mal beschränkt.
Erstens: Du musst zwingend einen POST-Request versenden. Damit reduzieren sich deine Möglichkeiten auf alles, was im Client oder auf dem Server 1 POST-Requests auf Server 2 machen kann.
Zweitens: Du willst den Server 1 beim Request weggelassen wissen. Also bleiben dir noch sämtliche Methoden, die im Client entsprechende Möglichkeiten bieten.
Die aktuell bekannten Möglichkeiten clientseitiger POST-Request-Erzeugung bestehen aus:
1. Formulare mit method=POST.
2. AJAX.
3. Flash.
Die Möglichkeit 1 wurde hier bereits ausführlich als unmöglich deklariert. Um mit einem Formular Dateien versenden zu können, ist es erforderlich, dass diese Datei sich auf dem Client befindet und in einem manuellen, nicht vorwählbaren Prozess vom Benutzer ausgewählt wird. Die Datei befindet sich aber nicht auf dem Client, sondern müsste zuvor manuell heruntergeladen werden.
Die Methode der server1-seitigen passenden Einbettung der Datei in z.B. BASE64 erfordert Anpassungen auf dem Server 2, damit er dieses Format versteht. Ich gehe mal davon aus, dass das nicht möglich ist.
Die Methode, das Formular ohne Datei an Server 1 zu senden, gemeinsam mit den Anmeldedaten für Server 2, um dann Server 1 den POST inklusive Datei machen zu lassen, wurde von dir auch verworfen.
Wenn wir Flash mal außenvor lassen, bleibt AJAX. AJAX erlaubt es in gewissen Grenzen, den Request zu beeinflussen.
Mit Javascript und somit bei AJAX kann man nicht auf das lokale Dateisystem des Clients zugreifen. Diese Antwort erhält man global in allen Foren, und sie ist korrekt. Diese Aufgabe hier erfordert das aber ja gerade nicht, denn die Datei liegt ja auf Server 1, und Server 1 ist wunderbar für jedes Javascript erreichbar, welches in einer HTML-Seite eingebettet ist, die ebenfalls von Server 1 ausgeliefert wird.
Es ist also denkbar, mit AJAX einen Multipart-Request zusammenzubauen. Folgende Antwort zeigt dazu einen Ansatz: http://bytes.com/groups/javascript/165254-ajax-prototype-js-multipart-form-data. Es wäre also denkbar, von Server 1 ein Formular mit einem versteckten riesigen Formularfeld (plus ein paar Metainformationen z.B. in anderen Feldern) abzurufen, und diese Dateidaten dann im AJAX-Request wieder zurückzuspielen.
Die Sache hat nur einen Haken: AJAX-Requests funktionieren nur im Rahmen der Same-Origin-Policy. DU kannst also nur dann einen frei formulierten POST-Request verwenden, wenn Server 1 das Ziel ist. Auf Server 2 hast du mit AJAX nur dann Zugriff, wenn AJAX-absendende Formularseite von Server 2 geladen wurde. Dann könnte man die Datei sogar per <script>-Einbindung von Server 1 verfügbar machen, und es würde funktionieren. Aber da ich ahne, dass du Server 2 nicht beeinflussen kannst, ist dir diese Möglichkeit verschlossen.
Und im Übrigen: Diese ganze Konstruktion ist so dermaßen manipulationsanfällig, dass man sie eigentlich absolut vermeiden will.
Und aufgrund der Same-Origin-Policy für AJAX-Requests dürfte es verständlich sein, warum derartige Konstruktionen nicht so wahnsinnig häufig nachgefragt werden: Wenn Quell- und Zielserver identisch sein müssen, lohnt es sich einfach nicht, die Datei zweimal über die Leitung zu schieben - von der Manipulationsgefahr auf dem Client mal ganz abgesehen.
- Sven Rautenberg