I’m using the following code for uploading an multiform/data form with a file upload:
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);
}
The server doesn’t recognizes the params in the request. I checked with wireshark, they are there but the IP header checksum is 0x0000. I think that’s problem.
Any idea where this is coming from?
The only thing I can see that might be incorrect is your use of println to generate HTTP content. Depending on your platform, the println’s may be outputting a single LF character or may be outputting a CR LF pair.
HTTP definitely requires CRLF after every header. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4. Right now your code is at risk of violating the HTTP protocol. It might work on some platforms but not on others. Also some servers might tolerate the violation of the protocol, but others might not. The least invasive change might be changing every println to print and explicitly adding the CRLF.
This may have nothing to do with your problem, but until you tighten up your conformance with HTTP your code will be at risk of failing.