В Джерси есть ошибка. См. Проблема кодированного кода .
Эта проблема появляется только для нескольких клиентов (iOS, Android).
Если вы установите Content-Type на application / octet-stream, то Jersey MessageWriter для application / octet-stream установит Content-Length и
не отправлять в виде фрагментированного транспорта.
Существует решение для Джерси. Клиент:
ClientConfig config = new DefaultClientConfig();
config.getProperties().put(ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE, 32 * 1024);
Но это не работает для клиента iOS или Android .
Итак, я проверил Apache File Upload. Была еще одна ошибка: «Поток неожиданно закончился».
Только Загрузка Oreilly может загрузить файл правильно для всех клиентов.
Это мой код:
public Object[] getParametersAndFiles(HttpServletRequest request) throws IOException {
log.debug("OreillyUpload");
Properties params = new Properties();
LinkedHashMap files = new LinkedHashMap();
File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
MultipartParser mp = new MultipartParser(request, 11024); // 10MB
Part part;
while ((part = mp.readNextPart()) != null) {
String name = part.getName();
if (part.isParam()) {
// it's a parameter part
ParamPart paramPart = (ParamPart) part;
String value = paramPart.getStringValue();
params.put(name, value);
log.debug("param; name=" + name + ", value=" + value);
}
else if (part.isFile()) {
// it's a file part
FilePart filePart = (FilePart) part;
String fileName = filePart.getFileName();
if (fileName != null) {
// the part actually contained a file
File file = new File(tempDirectory,fileName);
long size = filePart.writeTo(file);
files.put(name, file);
log.debug("file; name=" + name + "; filename=" + fileName +
", filePath=" + filePart.getFilePath() +
", content type=" + filePart.getContentType() +
", size=" + size);
}
else {
// the field did not contain a file
log.debug("file; name=" + name + "; EMPTY");
}
}
}
return new Object[] {params, files};
}
*1024* А это код сервера Джерси (предупреждающий, что все аннотации загрузки Джерси (например, как @FormDataParam) должны быть удалены):
@POST
@Path("uploadMarkup")
@Produces(MediaType.APPLICATION_JSON)
// @Consumes(MediaType.MULTIPART_FORM_DATA)
//// public void uploadMarkup(
// public JSONWithPadding uploadMarkup(
// @FormDataParam("markupFile") InputStream markupFile,
// @FormDataParam("markupFile") FormDataContentDisposition details,
// @FormDataParam("slideNum") int slideNum) {
public JSONWithPadding uploadMarkup(@Context HttpServletRequest request) {
Object[] data = uploadService.getParametersAndFiles(request);
...
}