Ich sitze im Moment an Code der einen Upload abbilden soll. Da das ganze bei mir im Großen nicht läuft, habe ich mir mal eine kleine Testumgebung aufgestellt mir der ich das machen kann.
Das PHP-Skript auf der Server-Seite sieht so aus:
<?php
$uploaddir = './uploads/';
$uploadfile = $uploaddir . basename($_FILES['file1']['name']);
if(move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile)) {
echo 'success ' . $_POST['input1'] . ' ' . $_POST['input2'];
} else {
echo 'error ';
var_dump($_FILES);
echo ' ';
var_dump($_POST);
}
?>
Alles anzeigen
Das funktioniert auch. Per HTML-Seite getestet.
Doch der Java-Code will und will nicht laufen. Ich hab mir im Wireshark angeschaut wie der Request vom Browser aussieht und wie der vom Java-Code. Die Unterschiede sind marginal. Ich denke, dass es daran also nicht liegt. (Kann ich gerne noch posten, falls Bedarf besteht.)
Beim Server kommen jedenfalls weder die FILE noch die POST Parameter an. Dementsprechend returniert dieser nur:
error array(0) {} array(0) {}
Das einzige was anders ist: Beim Request vom Java-Code stimmt die IP-Adresse nicht. In diesem SO-Post wird aber gemeint, dass sei egal.
public class SimpleUpload {
private static final String FILE_PATH = "/Users/MyUser/Documents/workspace/SimpleUploadTest/assets/clicknpoint.png";
private static final String DEST_URL = "http://localhost/test/upload.php";
@Test
public void uploadFile_shouldSucceed() throws IOException {
URL url = new URL(DEST_URL);
String boundary = "-----------------------------" + Long.toString(System.currentTimeMillis());
PrintWriter writer = null;
URLConnection con = url.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Accept-Charset", "utf-8");
con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8");
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
OutputStream output = con.getOutputStream();
InputStream input = new FileInputStream(new File(FILE_PATH));
writer = new PrintWriter(new OutputStreamWriter(output));
writer.println(boundary);
writer.println("Content-Disposition: form-data; name=\"input1\"");
writer.println();
writer.println("1234");
writer.flush();
writer.println(boundary);
writer.println("Content-Disposition: form-data; name=\"input1\"");
writer.println();
writer.println("asdf");
writer.flush();
writer.println(boundary);
writer.println("Content-Disposition: form-data; name=\"file1\"; filename=\"clicknpoint.png\"");
writer.println("Content-Type: image/png");
writer.println();
writer.flush();
int length = 0;
byte[] buffer = new byte[1024];
for(length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
writer.flush();
input.close();
writer.println();
writer.println(boundary + "--");
writer.flush();
input = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String cur = null;
StringBuffer buf = new StringBuffer();
while((cur = reader.readLine()) != null) {
buf.append(cur);
}
System.out.println(buf.toString());
Assert.assertTrue(buf.toString().startsWith("success"));
}
}
Alles anzeigen