2016-11-14 25 views
2

我想開發一個應用程序,它可以上傳任何類型的文件來中斷。我得到了源代碼。但它只適用於圖像。並且只能上傳2 MB以下的圖像文件。我想上傳所有類型的文件。請幫幫我。我的代碼如下所示。上傳2MB以上zip文件時Android Retrofit 2文件上傳不起作用

MainActivity.java

public class MainActivity extends AppCompatActivity { 
Service service; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button btn = (Button) findViewById(R.id.btn_upload); 

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 

    // Change base URL to your upload server URL. 
    service = new Retrofit.Builder().baseUrl("http://192.168.1.4/work/filesharing/").client(client).build().create(Service.class); 

    if (btn != null) { 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       String filePath1 = "/storage/emulated/0/gt.png"; 

       File file = new File(filePath1); 

       RequestBody reqFile = RequestBody.create(MediaType.parse("*/*"), file); 
       MultipartBody.Part body = MultipartBody.Part.createFormData("uploaded_file", file.getName(), reqFile); 
       RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "upload_test"); 



       retrofit2.Call<okhttp3.ResponseBody> req = service.postImage(body, name); 
       req.enqueue(new Callback<ResponseBody>() { 
        @Override 
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { } 

        @Override 
        public void onFailure(Call<ResponseBody> call, Throwable t) { 
         t.printStackTrace(); 

         Log.d("failure", "message = " + t.getMessage()); 
         Log.d("failure", "cause = " + t.getCause()); 
        } 
       }); 

      } 
     }); 
    } 
} 

} 

錯誤將示出。

11-14 17:09:14.369 13895-13960/app3.acs.com.file_upload2 D/OpenGLRenderer: Enabling debug mode 0 
11-14 17:09:16.068 13895-13993/app3.acs.com.file_upload2 D/OkHttp: --> POST http://192.168.1.4/work/filesharing/6.php HTTP/1.1 
11-14 17:09:16.068 13895-13993/app3.acs.com.file_upload2 D/OkHttp: Content-Type: multipart/form-data; boundary=b2c1d03e-f7a5-4e3f-89e1-d1c20358f7dc 
11-14 17:09:16.070 13895-13993/app3.acs.com.file_upload2 D/OkHttp: Content-Length: 20862337 
11-14 17:09:16.934 13895-13919/app3.acs.com.file_upload2 W/art: Suspending all threads took: 30.363ms 
11-14 17:09:16.935 13895-13993/app3.acs.com.file_upload2 I/art: Alloc partial concurrent mark sweep GC freed 20318(40MB) AllocSpace objects, 0(0B) LOS objects, 35% free, 28MB/44MB, paused 644us total 49.776ms 
11-14 17:09:18.272 13895-13993/app3.acs.com.file_upload2 I/art: Alloc sticky concurrent mark sweep GC freed 8(256B) AllocSpace objects, 0(0B) LOS objects, 10% free, 68MB/76MB, paused 1.012ms total 6.892ms 
11-14 17:09:18.293 13895-13993/app3.acs.com.file_upload2 I/art: Alloc partial concurrent mark sweep GC freed 6(192B) AllocSpace objects, 0(0B) LOS objects, 18% free, 68MB/84MB, paused 1.310ms total 18.796ms 
11-14 17:09:18.330 13895-13993/app3.acs.com.file_upload2 I/art: Alloc concurrent mark sweep GC freed 6(12KB) AllocSpace objects, 0(0B) LOS objects, 18% free, 68MB/84MB, paused 627us total 34.490ms 
11-14 17:09:18.332 13895-13993/app3.acs.com.file_upload2 I/art: Forcing collection of SoftReferences for 36MB allocation 
11-14 17:09:18.371 13895-13993/app3.acs.com.file_upload2 I/art: Alloc concurrent mark sweep GC freed 11(344B) AllocSpace objects, 0(0B) LOS objects, 18% free, 68MB/84MB, paused 569us total 38.975ms 
11-14 17:09:18.373 13895-13993/app3.acs.com.file_upload2 E/art: Throwing OutOfMemoryError "Failed to allocate a 38772598 byte allocation with 16777120 free bytes and 27MB until OOM" 
11-14 17:09:18.381 13895-13993/app3.acs.com.file_upload2 E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 
                     Process: app3.acs.com.file_upload2, PID: 13895 
                     java.lang.OutOfMemoryError: Failed to allocate a 38772598 byte allocation with 16777120 free bytes and 27MB until OOM 
                      at java.lang.String.<init>(String.java:332) 
                      at java.lang.String.<init>(String.java:371) 
                      at okio.Buffer.readString(Buffer.java:579) 
                      at okio.Buffer.readString(Buffer.java:562) 
                      at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:195) 
                      at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
                      at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160) 
                      at okhttp3.RealCall.access$100(RealCall.java:30) 
                      at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127) 
                      at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
                      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:818) 
11-14 17:09:20.069 13895-13993/app3.acs.com.file_upload2 I/Process: Sending signal. PID: 13895 SIG: 9 

回答

0

請減少日誌記錄級別或刪除它一起

看一看JakeWharton此鏈接https://github.com/square/retrofit/issues/540

「的答覆通過調用.setLogLevel(RestAdapter.LogLevel.FULL)您強制改造將整個請求體緩存到內存中,以便它可以記錄。這就是堆棧跟蹤中readBodyToBytesIfNecessary的調用正在執行的內容。

只有在調試時才能啓用這樣的日誌記錄。

+0

我沒有得到正確答案。請幫幫我。 –

+0

刪除任何日誌記錄攔截器 –

+0

刪除這些行 HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); –

0

其涉及此問題https://github.com/square/retrofit/issues/540 。你可以禁用你的攔截器Level.BODY。 它可以適用於所有類型的文件,您是否嘗試過使用其他類型的文件?

+0

是的,我已經嘗試過其他類型的文件,它只支持低於2 MB的圖像。 –

+0

您是否嘗試過更改此攔截器日誌記錄,如下所示: HttpLoggingInterceptor.Level.NONE –

+0

是的。但它不起作用。沒有上傳文件。也沒有顯示任何日誌。 –