我正在将图片从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流,内容类型头为binary / octet-stream
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 CODE:
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();
}
}
在我将Android的实体行更改为:
之后,AppEngine仍拒绝请求“请求被拒绝,因为没有找到多部分边界”错误FileEntity entity = new FileEntity(file, "multipart/mixed");
根据文档[http://hc.apache.org/httpclient-3.x/preference-api.html],"与MultipartRequestEntity结合使用的多部分边界字符串。未设置随机值时将为每个请求生成。“
此外,边界没有setter方法。
如何设置边界?
答案 0 :(得分:1)
内容类型是“multipart / mixed”,而不是“multipart / mixed stream”。同样有效的应该是“multipart / form-data”。但是,如果您只是上传图像,则可以将其作为image / jpeg上传,并通过调用(如果我没记错)读取服务器上请求的原始数据,request.getInputStream() - 无需完全使用Apache表单库。