Java Android多部分实体导致应用程序崩溃
我目前正在开发一款android应用程序,它允许用户将图像上传到我的服务器。我是android开发的新手,所以在使用Http MultiPartEntity时,目前面临将文件发送到服务器的问题 下面是我用来将文件上传到服务器的代码 私有类UploadFileToServer扩展异步任务{Java Android多部分实体导致应用程序崩溃,java,android,apache,android-asynctask,Java,Android,Apache,Android Asynctask,我目前正在开发一款android应用程序,它允许用户将图像上传到我的服务器。我是android开发的新手,所以在使用Http MultiPartEntity时,目前面临将文件发送到服务器的问题 下面是我用来将文件上传到服务器的代码 私有类UploadFileToServer扩展异步任务{ @Override protected String doInBackground(Void... params) { return uploadFile(); }
@Override
protected String doInBackground(Void... params) {
return uploadFile();
}
@SuppressWarnings("deprecation")
private String uploadFile() {
String responseString = null;
//Change URL here
String FILE_UPLOAD_URL = SERVER_SUBMIT_URL;
try {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(FILE_UPLOAD_URL);
MultipartEntity reqEntity = new MultipartEntity();
File file1 = new File(filePath1);
FileBody bin1 = new FileBody(file1);
reqEntity.addPart("image1", bin1);
//Extras
reqEntity.addPart("command", new StringBody("uploadImages"));
post.setEntity(reqEntity);
HttpResponse response = client.execute(post);
resEntity = response.getEntity();
responseString = EntityUtils.toString(resEntity);
return responseString;
} catch (Exception e) {
Log.v(TAG, e.toString());
responseString = e.toString();
}
return responseString;
}
@Override
protected void onPostExecute(String result) {
//Assuming JSON response From server
// {"status": true, "ideaID" : 1}
try{
JSONObject json = new JSONObject(result);
boolean status = json.getBoolean("status");
if(status){
showToast("Successfully Uploaded Images");
}else{
showToast("Image Uploading Failed");
}
}catch (Exception e) {
showToast("Image Uploading Failed");
Log.e(TAG, "Response from server: " + result + " " + e.getMessage());
}
// showing the server response in an alert dialog
super.onPostExecute(result);
}
}
我想,“HttpResponse response=client.execute(post);”这行就是应用程序崩溃的地方
下面是日志中显示的错误
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway /AndroidRuntime: FATAL EXCEPTION: AsyncTask #5
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:239)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.lang.Thread.run(Thread.java:838)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: Caused by: java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.entity.ContentType.toString(ContentType.java:153)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.entity.mime.MultipartFormEntity.<init>(MultipartFormEntity.java:53)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.entity.mime.MultipartEntityBuilder.buildEntity(MultipartEntityBuilder.java:236)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.entity.mime.MultipartEntity.getEntity(MultipartEntity.java:119)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.entity.mime.MultipartEntity.isChunked(MultipartEntity.java:138)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.protocol.RequestContent.process(RequestContent.java:79)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.protocol.BasicHttpProcessor.process(BasicHttpProcessor.java:290)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:167)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:413)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at com.example.grow.dubaiway.ImageActivity$UploadFileToServer.uploadFile(ImageActivity.java:197)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at com.example.grow.dubaiway.ImageActivity$UploadFileToServer.doInBackground(ImageActivity.java:156)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at com.example.grow.dubaiway.ImageActivity$UploadFileToServer.doInBackground(ImageActivity.java:137)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:234)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-22 00:24:41.341 8203-11792/com.example.grow.dubaiway E/AndroidRuntime: at java.lang.Thread.run(Thread.java:838)
任何帮助都将不胜感激。谢谢您可以尝试使用MultipartEntityBuilder
try
{
File file1 = new File(filePath1);
HttpClient client = new DefaultHttpClient();
MultipartEntityBuilder entBuilder = MultipartEntityBuilder.create();
entBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entBuilder.addBinaryBody(file1.getName(), file1);
//Extras
entBuilder.addPart("command", new StringBody("uploadImages"));
/*
If you need to send more files...
entBuilder.addBinaryBody(file2.getName(), file2);
entBuilder.addBinaryBody(file3.getName(), file3);
...
*/
HttpEntity entity = entBuilder.build();
HttpPost post = new HttpPost(FILE_UPLOAD_URL);
post.setEntity(entity);
HttpResponse response = client.execute(post);
HttpEntity httpEntity = response.getEntity();
return EntityUtils.toString(httpEntity);
}
catch(Exception e)
{
e.printStackTrace();
}
您需要在gradle中添加依赖项
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5'
compile (group: 'org.apache.httpcomponents' , name: 'httpmime' , version: '4.3.5') {
exclude module: 'org.apache.httpcomponents:httpclient'
}
但我认为最好从代码中删除http apache依赖项(如HttpClient),就像谷歌从Android 6(api 23)中删除它一样
Android 6.0版本取消了对Apache HTTP客户端的支持
您的应用程序正在使用此客户端,目标是Android 2.3(API级别9)或
更高,使用HttpURLConnection类
高效,因为它通过透明
压缩和响应缓存,并将功耗降至最低
HttpClient
方法在即将发布的版本中被弃用,所以为什么不使用Volley
或HttpURLConnection
来发出http请求@ρ∑ρρK Volley也使用Apache的库:)嘿,伙计们,谢谢你们的反馈。尽管如此,我还是通过使用旧版本的库修复了这个问题。切换到版本4.3.1解决了d我解决了这个问题,现在它工作得很好。我们还可以将多部分实体与进度发布器一起使用。无论如何,谢谢。:)
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5'
compile (group: 'org.apache.httpcomponents' , name: 'httpmime' , version: '4.3.5') {
exclude module: 'org.apache.httpcomponents:httpclient'
}