The response to one kind of HTTP request I send is a multipart/form-data looks something like:
--------boundary123
Content-Disposition: form-data; name="json"
Content-Type: application/json
{"some":"json"}
--------boundary123
Content-Disposition: form-data; name="bin"
Content-Type: application/octet-stream
<file data>
--------boundary123
I've been using apache to send and receive the HTTP requests, but I can't seem to find an easy way to use it to parse the above for easy access of the form fields.
I would prefer not to reinvent the wheel, so I'm looking for a library that allows me to do something similar to:
MultipartEntity multipart = new MultipartEntity(inputStream);
InputStream bin = multipart.get("bin");
Any suggestions?
See Apache Commons File Upload
If you are using Spring MVC, see this http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch16s08.html
Example code using deprecated constructor:
import java.io.ByteArrayInputStream;
import org.apache.commons.fileupload.MultipartStream;
public class MultipartTest {
// Lines should end with CRLF
public static final String MULTIPART_BODY =
"Content-Type: multipart/form-data; boundary=--AaB03x\r\n"
+ "\r\n"
+ "----AaB03x\r\n"
+ "Content-Disposition: form-data; name=\"submit-name\"\r\n"
+ "\r\n"
+ "Larry\r\n"
+ "----AaB03x\r\n"
+ "Content-Disposition: form-data; name=\"files\"; filename=\"file1.txt\"\r\n"
+ "Content-Type: text/plain\r\n"
+ "\r\n"
+ "HELLO WORLD!\r\n"
+ "----AaB03x--\r\n";
public static void main(String[] args) throws Exception {
byte[] boundary = "--AaB03x".getBytes();
ByteArrayInputStream content = new ByteArrayInputStream(MULTIPART_BODY.getBytes());
@SuppressWarnings("deprecation")
MultipartStream multipartStream =
new MultipartStream(content, boundary);
boolean nextPart = multipartStream.skipPreamble();
while (nextPart) {
String header = multipartStream.readHeaders();
System.out.println("");
System.out.println("Headers:");
System.out.println(header);
System.out.println("Body:");
multipartStream.readBodyData(System.out);
System.out.println("");
nextPart = multipartStream.readBoundary();
}
}
}
Example code without using deprecated methods.
import com.google.common.net.MediaType;
import org.apache.commons.fileupload.RequestContext;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
public class SimpleRequestContext implements RequestContext {
private final Charset charset;
private final MediaType contentType;
private final byte[] content;
public SimpleRequestContext(Charset charset, MediaType contentType, byte[] content) {
this.charset = charset;
this.contentType = contentType;
this.content = content;
}
public String getCharacterEncoding() {
return charset.displayName();
}
public String getContentType() {
return contentType.toString();
}
@Deprecated
public int getContentLength() {
return content.length;
}
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(content);
}
}
{
...
Charset encoding = UTF_8;
RequestContext requestContext = new SimpleRequestContext(encoding, contentType, body.getBytes());
FileUploadBase fileUploadBase = new PortletFileUpload();
FileItemFactory fileItemFactory = new DiskFileItemFactory();
fileUploadBase.setFileItemFactory(fileItemFactory);
fileUploadBase.setHeaderEncoding(encoding.displayName());
List<FileItem> fileItems = fileUploadBase.parseRequest(requestContext);
...
}