Android для appEngine тип содержимого изображения - PullRequest
1 голос
/ 04 октября 2010

Я отправляю изображение с телефона Android в AppEngine. AppEngine создает исключения для содержимого. Мой процесс устранения не удался, поэтому я подозреваю, что сделал что-то большее неправильно У меня проблема с типом контента или проблема большего размера?

Журнал AppEngine показывает следующие ошибки в зависимости от типа контента [тип контента -> возникающая ошибка]:

multipart / mixed stream -> org.apache.commons.fileupload.FileUploadException: запрос был отклонен, так как не было найдено многокомпонентной границы, запрос был отклонен, поскольку не было найдено многочастной границы

image / jpg -> org.apache.commons.fileupload.FileUploadBase $ InvalidContentTypeException: запрос не содержит multipart / form-data или multipart / mixed потока, заголовок типа содержимого - image / jpg

binary / octet-stream -> org.apache.commons.fileupload.FileUploadBase $ InvalidContentTypeException: запрос не содержит multipart / form-data или multipart / mixed потока, заголовок типа содержимого является двоичным / octet-stream

Код Android:

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],"The составная граничная строка, используемая вместе с MultipartRequestEntity. Если не установлено, случайное значение будет генерироваться для каждого запроса. "

Далее, нет никаких методов установки для границы.

Как мне установить границу?

1 Ответ

1 голос
/ 04 октября 2010

Тип содержимого «multipart / mixed», а не «multipart / mixed stream».Также допустимым должно быть «multipart / form-data».Если вы просто загружаете изображение, вы можете загрузить его как image / jpeg и прочитать необработанные данные из запроса на сервере, вызвав (если я правильно помню) request.getInputStream () - не нужноиспользовать библиотеку форм Apache вообще.

...