Библиотека и примеры разбора multipart / form-данных из inputstream
ответ на один вид HTTP-запроса, который я отправляю, - это multipart / form-data выглядит примерно так:
--------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
Я использую apache для отправки и получения HTTP-запросов, но я не могу найти простой способ использовать его для анализа выше для легкого доступа к полям формы.
Я бы предпочел не изобретать колесо, поэтому я ищу библиотеку, которая позволяет мне делать что-то подобное:
MultipartEntity multipart = new MultipartEntity(inputStream);
InputStream bin = multipart.get("bin");
какие предложения?
3 ответов
посмотреть Загрузка Файла Apache Commons
Если вы используете Spring MVC, см. Это http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch16s08.html
пример кода с использованием устаревшего конструктора:
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();
}
}
}
пример кода без использования устаревших методов. импортировать com.Гугл.общие.чистая.Тип носителя; импорт организации.апаш.палата общин.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);
...
}