如何在POST请求中提交一个文本字段,将blob上传到Blobstore,并在blob的上传处理程序中检索它?

我已经阅读了StackOverflow的几个类似的问题,但还没有find解决这个问题呢。

我通过HTTPPost将Blob从Android上传到App Engine的Blobstore,然后上传到由Blobstore服务生成的上传URL。 我希望能够发送一些文本元数据与这个请求,标识这个blob。 我想要检索这个信息以及上传处理程序servlet中的blob关键字,这个关键字在blob被上传后被调用。

问题在于blob使用多部分编码上传,App Engine不支持Servlet v3.0标准,所以我不能使用req.getPart()来获取文本部分。 (blob本身由Blobstore服务返回,所以部分请求已经为我们parsing了。)

如何通过只传递一个文本参数以及上传到Blobstore的文件来解决此问题,并在上​​传blob后调用的servlet中检索它?

非常感谢你的帮助! 相当卡住在这一个!

以下是我在Android上用于HttpPost的代码:

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(); } 

更新(2014年12月8日):

在构buildHttpPost请求的multipart-entity之前,我在实体构build器中添加了一个文本主体,如下所示:

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

对于Blob上传后处理Blobstorecallback的servlet,我使用了Google所描述的方法来分析本教程中App Engine上的HttpPost请求,如下所示:

 @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); } 

但是,在此操作之后,当我检查数据存储中的paramNamesvariables时,其值保持为“default”。 这意味着在Blobstore传递给上传处理程序servlet的重写POST请求中找不到表单字段。 从这往哪儿走??

Solutions Collecting From Web of "如何在POST请求中提交一个文本字段,将blob上传到Blobstore,并在blob的上传处理程序中检索它?"

有一种方法可以将元数据与blob一起发布,而这些信息不会被blobkey代表:

  1. 在你的上传表单中,包括这个:

     method="post" enctype="multipart/form-data" 
  2. 现在你可以添加隐藏的字段:

     <input type="hidden" name="myName" value="<%= myName %>"/> 
  3. 或者你可以添加input字段:

     <input type="text" name="myText" size="50" value="Enter your text"/> 
  4. 在您的servlet中,确保后处理程序读取元数据

     String userName = req.getParameter("myName"); 
  5. 现在您可以使用所有信息的“上传”表单了。

  6. 当你传递的信息服务blob,你可以使用

     &blobkey=daffedafdfe&myName=Blah 

所以,你不是完全存储在blob本身的信息,但你可以将其包含在上传表单。

从我所知道的情况来看,MultiPartEntityBuilder负责模拟enctype =“multipart / form-data”的HTML“表单”,然后当你到达DefaultHttpClient行时,你只是从这个表单发送请求通过POST。 您应该查看实体构build器的documentaiton。 它具有添加文本字段到“表单”的function[1]。

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

以防万一,你可能要指定

entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

创build对象后。

如果这不起作用,可能会build议您发送请求,以查看您正在收到的内容