多端口android中的不可重复请求异常
我正在尝试使用多部分方法将图像文件从我的应用程序上载到服务器。一旦我发送请求,我就陷入了一个称为“不可重复请求异常”的问题。我不熟悉这种方法,不知道如何处理 这是我的密码:-多端口android中的不可重复请求异常,android,http,httpclient,image-uploading,multipart,Android,Http,Httpclient,Image Uploading,Multipart,我正在尝试使用多部分方法将图像文件从我的应用程序上载到服务器。一旦我发送请求,我就陷入了一个称为“不可重复请求异常”的问题。我不熟悉这种方法,不知道如何处理 这是我的密码:- File imageFile = new File("/mnt/sdcard/link.jpg"); Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); ByteArrayOutputS
File imageFile = new File("/mnt/sdcard/link.jpg");
Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
byte[] image = stream.toByteArray();
String img_str = Base64.encodeToString(image, 0);
InputStream imageStream;
JSONObject objResult;
boolean bSucess = true;
// Base 64 image string was stored with image object ,
//String imageBase64 = image.getImageString();
// This base64 to byte , One can directly read bytes from file from Disk
String imageDataBytes = img_str.substring( img_str.indexOf(",")+1);
HttpClient client = null;
HttpPost post = null;
HttpResponse response = null;
HttpEntity httpEntity = null;
imageStream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT));
try{
//Forming Json Object
JSONObject jsonImageMetdata = new JSONObject();
JSONObject objMultipart = new JSONObject();
try {
objMultipart.put("status", 1+"");
objMultipart.put("type", "Photo");
objMultipart.put("filename", "menu.jpg");
objMultipart.put("filetype", "image/jpeg");
objMultipart.put("user_id", "1");
objMultipart.put("auth_id", "1");
objMultipart.put("userfile", Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT));
jsonImageMetdata.put("MultipartImageMetadata", objMultipart);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// converting json data to string
String strImageMetadata = jsonImageMetdata.toString();
client = new DefaultHttpClient();
post = new HttpPost("http://stage.phonethics.in/inorbitapp/place_api/menu_list");
post.setHeader("X-API-KEY", "d41d8cd98f00b204e9800998ecf8427e");
MultipartEntityBuilder entityBuilder = null;
try{
entityBuilder = MultipartEntityBuilder.create();
}
catch(Exception a){
Log.d("name",a.getMessage());
throw a;
}
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
// adding text
entityBuilder.addTextBody("dummyParameter","Dummy text",ContentType.TEXT_PLAIN);
// adding Image
if(imageStream != null){
entityBuilder.addBinaryBody("file", imageStream,ContentType.create("image/jpeg"),"imagename.jpg");
}
// sending formed json data in form of text
entityBuilder.addTextBody("descriptions", strImageMetadata, ContentType.APPLICATION_JSON) ;
HttpEntity entity = entityBuilder.build();
post.setEntity(entity);
response = client.execute(post);
httpEntity = response.getEntity();
result = EntityUtils.toString(httpEntity);
有人能帮我解决这个问题吗。任何帮助都是值得的。
谢谢。我的团队本周也遇到了同样的问题。事实证明,对主体使用
InputStream
是问题的根本原因。由于InputStream
不可重新读取,因此请求被标记为“不可重复”。您需要使用另一个addBinaryBody
方法签名,例如接受java.io.File
的签名 我使用一类Jet3T亚马逊工具包解决了这个问题,他的名字是RepeatableInputStream
。在您的情况下,将其导入到依赖项中。在我的项目中,我使用常春藤。我给你看两种模式
马文:
<dependency>
<groupId>net.java.dev.jets3t</groupId>
<artifactId>jets3t</artifactId>
<version>0.7.2</version>
</dependency>
这个答案在金钱上是正确的!我将我的
InputStreamBody
实现替换为FileBody
,问题消失了。
<dependency org="net.java.dev.jets3t" name="jets3t" rev="0.7.2"/>
// adding Image
if(imageStream != null){
RepeatableInputStream imageStreamRepeatable = new RepeatableInputStream(imageStream,imageDataBytes.getBytes());
entityBuilder.addBinaryBody("file", imageStreamRepeatable,ContentType.create("image/jpeg"),"imagename.jpg");
}