簡體   English   中英

Android MultiPart Entity導致應用程序崩潰

[英]Android MultiPart Entity Causing App Crash

我目前正在使用一個Android應用,該應用將允許用戶將圖像上傳到我的服務器。 我是android開發的新手,因此當前在使用Http MultiPartEntity時將文件發送到服務器時遇到問題

下面給出的是我用於將文件上傳到服務器私有類的代碼UploadFileToServer擴展了AsyncTask {

    @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) 

真的可以在此問題上使用一些幫助。 我已經檢查了其他帖子,但它們對我不起作用。

Ive包括了apache網站中的以下庫。 httpclient-4.5.1.jar httpclient-cache-4.5.1.jar httpcore-4.4.3.jar httpmime-4.5.1.jar

這是我的gradle文件看起來像apply插件:'com.android.application'

android {
   compileSdkVersion 23
   buildToolsVersion "23.0.2"

   defaultConfig {
       applicationId "com.example.neeraj.imageapp"
       minSdkVersion 14
       targetSdkVersion 23
       versionCode 1
       versionName "1.0"
   }
   buildTypes {
      release {
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
       }
   }

   packagingOptions {
       exclude 'META-INF/DEPENDENCIES.txt'
       exclude 'META-INF/LICENSE.txt'
       exclude 'META-INF/NOTICE.txt'
       exclude 'META-INF/NOTICE'
       exclude 'META-INF/LICENSE'
       exclude 'META-INF/DEPENDENCIES'
       exclude 'META-INF/notice.txt'
       exclude 'META-INF/license.txt'
       exclude 'META-INF/dependencies.txt'
   }
}

dependencies {
   compile fileTree(dir: 'libs', include: ['*.jar'])
   testCompile 'junit:junit:4.12'
   compile 'com.android.support:appcompat-v7:23.1.1'
   compile 'com.android.support:design:23.1.1'
}

任何幫助,將不勝感激。 謝謝

您可以嘗試使用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),因為Google從Android 6(api 23)中刪除了它

Android 6.0版本刪除了對Apache HTTP客戶端的支持。 如果您的應用程序正在使用此客戶端,並且定位到Android 2.3(API級別9)或更高版本,請改用HttpURLConnection類。 該API效率更高,因為它通過透明壓縮和響應緩存減少了網絡使用,並最大程度地降低了功耗

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM