我正在尝试使用Multipart方法将图像文件从我的应用程序上传到服务器。一旦我发送请求,我就会遇到一个被称为“不可重复的请求异常”的麻烦。我是这种方法的新手,不知道如何处理这个问题。
这是我的代码: -
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);
有人可以帮我解决这个问题。任何帮助都会很明显。 感谢。
答案 0 :(得分:2)
我的团队本周也遇到了同样的问题。事实证明,对身体使用InputStream
是问题的根本原因。由于InputStream
不可重复读取,因此请求标记为"不可重复"。您需要使用其他addBinaryBody
方法签名之一,例如接受java.io.File
的签名。
答案 1 :(得分:0)
我使用一类JetS3t Amazon工具包解决了这个问题,他的名字是RepeatableInputStream
。在您的情况下,在依赖项中导入它。在我的项目中,我使用常春藤。我告诉你两种模式。
的Maven:
<dependency>
<groupId>net.java.dev.jets3t</groupId>
<artifactId>jets3t</artifactId>
<version>0.7.2</version>
</dependency>
常春藤:
<dependency org="net.java.dev.jets3t" name="jets3t" rev="0.7.2"/>
在imageStream中使用此类后,将其包装为可重复的。
// adding Image
if(imageStream != null){
RepeatableInputStream imageStreamRepeatable = new RepeatableInputStream(imageStream,imageDataBytes.getBytes());
entityBuilder.addBinaryBody("file", imageStreamRepeatable,ContentType.create("image/jpeg"),"imagename.jpg");
}