Intereting Posts
Как проверить транзакции Android на основе приложения на MY-сервере? Как отключить прокрутку AppBarLayout в CoordinatorLayout? Отключить исходные выходные данные logcat в Android Создайте проект Android в командной строке OSX: Task 'assembleDebug' не найден в корневом проекте Как сделать резервную копию контактов или смс на SD-карту в виде файла .xml или .csv и восстановить ее позже Как я могу добавить ярлык моего приложения на рабочий стол при установке приложения? Android getDefaultSharedPreferences Как получить данные об авариях из моего приложения Android? Диалоговое обрезание с помощью AppCompat-v7 22 приводит к уродливым теням на api <21 Camera.release () занимает 30 секунд, чтобы освободить камеру в Nexus 10. Есть ли способ ускорить процесс? Как узнать размер файла перед его загрузкой? Значок Android SeekBar, где находятся значения Автоматический поиск в виде пользовательских типов Цвет текста действия с заставкой не меняется Получение истории WebView из WebBackForwardList

Как я могу отправить текстовое поле в запросе POST, который загружает blob в Blobstore и извлекает его в обработчик загрузки для blob?

Я прочитал несколько похожих вопросов по StackOverflow, но пока не нашел решение этой проблемы.

Я загружаю blob из Android в Blobstore App Engine через HTTPPost на URL-адрес загрузки, созданный службой Blobstore. Я хочу, чтобы иметь возможность отправлять некоторые текстовые метаданные с этим запросом, который идентифицирует этот blob. Я хочу получить эту информацию вместе с ключом blob в сервлете обработчика загрузки, который вызывается после загрузки блоба.

Проблема в том, что blob загружается с использованием многострочной кодировки, а App Engine не поддерживает стандарт Servlet v3.0, поэтому я не могу использовать req.getPart () для получения текстовой части. (Сам blob возвращается службой Blobstore, так что часть запроса уже проанализирована для нас.)

Как я могу обойти эту проблему, передав только один текстовый параметр вместе с файлом, который загружается в Blobstore и извлекает его в сервлет, который вызывается после загрузки блоба?

Большое спасибо за Вашу помощь! Совсем застрял на этом!

Вот код, который я использую для HttpPost на Android:

File file = new File(filePath); MultipartEntityBuilder entityBuilder = MultipartEntityBuilder .create(); entityBuilder.addBinaryBody("file", file); DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(blobUploadURL); httpPost.setEntity(entityBuilder.build()); try { HttpResponse response = httpClient.execute(httpPost); statusCode = response.getStatusLine().getStatusCode(); } 

ОБНОВЛЕНИЕ (8 декабря, 14):

Я добавил текстовое тело к строителю объектов, прежде чем создавать многочастную сущность для запроса HttpPost следующим образом:

  String param="value"; entityBuilder.addTextBody("param", param); 

Для сервлета, который обрабатывает обратный вызов Blobstore после загрузки блоба, я использовал метод, описанный Google, для анализа запроса HttpPost на App Engine в этом руководстве, как показано ниже:

 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String paramNames="default"; try { ServletFileUpload upload=new ServletFileUpload(); FileItemIterator iterator=upload.getItemIterator(req); while(iterator.hasNext()){ FileItemStream item=iterator.next(); InputStream stream=item.openStream(); if(item.isFormField()){ paramNames+=item.getFieldName() + ", "; } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); paramNames="error"; } //save the paramNames variable in the Datastore for debugging later saveParamNamesInDatastore(paramNames); } в @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String paramNames="default"; try { ServletFileUpload upload=new ServletFileUpload(); FileItemIterator iterator=upload.getItemIterator(req); while(iterator.hasNext()){ FileItemStream item=iterator.next(); InputStream stream=item.openStream(); if(item.isFormField()){ paramNames+=item.getFieldName() + ", "; } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); paramNames="error"; } //save the paramNames variable in the Datastore for debugging later saveParamNamesInDatastore(paramNames); } 

Однако, когда я проверяю переменную paramNames в хранилище данных после этой операции, ее значение остается «по умолчанию». Это означает, что в перезаписанном запросе POST, которое Blobstore не передал сервлету обработчика загрузки, не было найдено поля формы. Куда пойти отсюда??

Solutions Collecting From Web of "Как я могу отправить текстовое поле в запросе POST, который загружает blob в Blobstore и извлекает его в обработчик загрузки для blob?"

Есть способ опубликовать метаданные с вашим блобом с информацией, которая не была бы представлена ​​blobkey:

  1. В форме загрузки укажите следующее:

     method="post" enctype="multipart/form-data" 
  2. Теперь вы можете добавить скрытые поля:

     <input type="hidden" name="myName" value="<%= myName %>"/> 
  3. Или вы можете добавить поля ввода:

     <input type="text" name="myText" size="50" value="Enter your text"/> 
  4. В своем сервлете убедитесь, что обработчик сообщения считывает метаданные

     String userName = req.getParameter("myName"); 
  5. Теперь у вас есть форма «Загрузить» со всей информацией.

  6. Когда вы передаете информацию для обслуживания blob, вы можете использовать

     &blobkey=daffedafdfe&myName=Blah 

Таким образом, вы не точно сохраняете информацию в самой блобе, но можете добавить ее в форму загрузки.

Из того, что я могу сказать, MultiPartEntityBuilder отвечает за издевательство HTML-формы «enctype =« multipart / form-data », а затем, когда вы попадаете в строки DefaultHttpClient, вы просто отправляете запрос из этой формы Через POST. Вы должны заглянуть в документ для создателя объекта. Он имеет функцию добавления текстовых полей в «форму» [1].

[1] – http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntityBuilder.html#addTextBody(java.lang.String,%20java.lang .String)

На всякий случай, вы можете указать

entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

После создания объекта.

Если это не работает, может быть целесообразно опубликовать сообщение requestbin, чтобы узнать, что именно вы получаете