Я отправляю изображение с телефона Android в AppEngine. AppEngine бросает исключения для контента. Мой процесс устранения не удался, поэтому я подозреваю, что сделал нечто большее. У меня есть проблема с типом контента или проблема с большим объемом?
Журнал AppEngine показывает следующие ошибки в зависимости от типа содержимого [тип контента → результирующая ошибка]:
multipart/mixed stream → org.apache.commons.fileupload.FileUploadException: запрос был отклонен, потому что не было обнаружено многострочной границы, запрос был отклонен, потому что не было найдено многострочной границы
image/jpg → org.apache.commons.fileupload.FileUploadBase $InvalidContentTypeException: запрос не содержит многочастный/форматированный или многочастный/смешанный поток, заголовок типа контента - это изображение /jpg
binary/octet-stream → org.apache.commons.fileupload.FileUploadBase $InvalidContentTypeException: запрос не содержит многочастный/форматированный или многочастный/смешанный поток, заголовок типа контента - двоичный/октетный поток
ANDROID CODE:
static void apachePost(File file) {
File file = new File(directory, fileName);
try {
String url = "http://chexserve.appspot.com/chexappengine";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
FileEntity entity = new FileEntity(file, "multipart/mixed stream");
httpPost.setEntity(entity);
Log.v(Constants.CHEX,
"executing request " + httpPost.getRequestLine());
HttpResponse response = httpclient.execute(httpPost);
Log.v(Constants.CHEX, "received http response " + response);
HttpEntity resEntity = response.getEntity();
httpclient.getConnectionManager().shutdown();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
КОД APPENGINE:
public class ChexAppEngineServlet extends HttpServlet {
private static final Logger LOG = Logger
.getLogger(ChexAppEngineServlet.class.getName());
/** Processes the incoming request */
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
LOG.info("LOG: received post");
System.out.println("PRINTLN: received post " + request);
try {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter;
iter = upload.getItemIterator(request);
if (iter.hasNext()) {
FileItemStream imageItem = iter.next();
InputStream imgStream = imageItem.openStream();
System.out.println("PRINTLN: created imgStream " + imgStream);
// construct our entity objects
Blob imageBlob = new Blob(IOUtils.toByteArray(imgStream));
MyImage myImage = new MyImage(imageItem.getName(), imageBlob);
System.out.println("PRINTLN: created my image " + myImage);
} else {
System.out.println("PRINTLN: no file in post");
LOG.info("LOG: no file in post");
}
} catch (FileUploadException e) {
LOG.info("failed to parse post request: " + e);
e.printStackTrace();
}
}
AppEngine по-прежнему отклоняет запрос, когда "запрос был отклонен, потому что не было обнаружено многократной границы", после того, как я изменил строку сущности Android на:
FileEntity entity = new FileEntity(file, "multipart/mixed");
В соответствии с документацией [http://hc.apache.org/httpclient-3.x/preference-api.html],] Многостраничная граничная строка для использования в сочетании с MultipartRequestEntity. Когда не задано случайное значение будет генерироваться для каждого запроса.
Кроме того, для границы не существует методов сеттера.
Как установить границу?
Тип содержимого "multipart/mixed", а не "multipart/mixed stream". Также допустимым должен быть "multipart/form-data". Если вы просто загружаете изображение, вы можете загрузить его как изображение /jpeg и прочитать необработанные данные из запроса на сервере, вызвав (если я правильно помню), request.getInputStream() - не нужно используйте библиотеку форм Apache вообще.