使用MultipartEntityBuilder上传文件会出现错误

时间:2016-05-02 10:46:12

标签: android android-asynctask multipartentity

在我的Android应用程序中,我正在使用AsyncTask将文件上传到后端。在那里我在doInBackground方法中使用MultipartEntityBuilder。我的doInBackground部分如下,

@Override
protected String doInBackground(String... params) {

    try {
        String serverLoaction = params[0];
        String filePath = params[1];

        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpPost httpPost = new HttpPost(serverLoaction);

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

        FileBody fileBody = new FileBody(new File(filePath));
        StringBody stringBody = new StringBody("data", ContentType.MULTIPART_FORM_DATA);

        builder.addPart("file", fileBody);
        builder.addPart("name", stringBody);

        httpPost.setEntity(builder.build());

        HttpResponse response = httpClient.execute(httpPost, localContext);

        BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                        response.getEntity().getContent(), "UTF-8"));

        String sResponse = reader.readLine();
        return sResponse;

    } catch (Exception e) {
        if (dialog.isShowing())
            dialog.dismiss();
        Toast.makeText(getApplicationContext(), "Error in downloading image", Toast.LENGTH_LONG).show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
        return null;
    }
}

这显示我没有语法错误。但是当我运行代码时,异常抛出并且应用程序停止。错误日志如下所示。

Process: com.x.x, PID: 6271
 java.lang.RuntimeException: An error occured while executing doInBackground()
 at android.os.AsyncTask$3.done(AsyncTask.java:300)
 at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
 at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
 at java.util.concurrent.FutureTask.run(FutureTask.java:242)
 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
 at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE
 at org.apache.http.entity.ContentType.toString(ContentType.java:153)
 at org.apache.http.entity.mime.MultipartFormEntity.<init>(MultipartFormEntity.java:56)
 at org.apache.http.entity.mime.MultipartEntityBuilder.buildEntity(MultipartEntityBuilder.java:236)
 at org.apache.http.entity.mime.MultipartEntityBuilder.build(MultipartEntityBuilder.java:240)
 at com.x.x.ui.farm_activity.AddCropMonitors$UploadFileTask.doInBackground(AddCropMonitors.java:1905)
 at com.x.x.ui.farm_activity.AddCropMonitors$UploadFileTask.doInBackground(AddCropMonitors.java:1875)
 at android.os.AsyncTask$2.call(AsyncTask.java:288)
 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
 at java.lang.Thread.run(Thread.java:841)

它告诉NoSuchFieldError异常引发,但是我经历了几个教程,在我看来,根据它们,代码是可以的。指向错误发生位置的行号指向

httpPost.setEntity(builder.build());

线。那么这个代码段的问题是什么,我该如何解决这个问题。谢谢和问候!

1 个答案:

答案 0 :(得分:1)

我认为这是由于您在build.gradle文件中使用的库。 请查看以下代码

compile('org.apache.httpcomponents:httpmime:4.3.6') {
exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'