2016-01-26 25 views
3

我想上傳的Android /科特林文件:無法上傳Android的文件,有沒有錯誤的細節

class MainActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    //........... 

    UploadFilesTask().execute(1) 

} 

//....... 

private class UploadFilesTask : AsyncTask<Int, Int, Int>() { 
    override fun doInBackground(vararg params: Int?): Int? { 
     val MEDIA_TYPE_PNG = MediaType.parse("image/jpg") 
     val client = OkHttpClient() 
     val requestBody = MultipartBody.Builder() 
      .setType(MultipartBody.FORM) 
      .addFormDataPart("title", "test123") 
      .addFormDataPart("file", "image-name-123.jpg", RequestBody.create(MEDIA_TYPE_PNG, 
       File("/storage/emulated/0/Download/real-file-name.jpg"))) 
      .build() 

     val request = Request.Builder() 
      .url("http://httpbin.org/post") 
      .post(requestBody) 
      .build() 

     val response = client.newCall(request).execute() 
     if (!response.isSuccessful) { 
     throw IOException("Unexpected code " + response) 
     } else { 
     Log.d("test", "Done123") 
     Log.d("test", response.body().string()) 
     } 

     return 123 
    } 

    protected fun onProgressUpdate(vararg progress: Int) { 
    } 

    protected override fun onPostExecute(result: Int?) { 
    } 
    } 

唯一的錯誤信息,我可以看到,當我運行它:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 

我該如何解決?

的權限是:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

和依賴性:

compile "com.squareup.okhttp3:okhttp:3.0.1" 
+0

也許,你需要添加WRITE_EXTERNAL_STORAGE許可? – Majestic

+0

@Majestic,тычё? Голова。 Причёмтут寫? –

+0

不要使用'/ storage/emulated/0',請使用'Environment.getExternalStorageDirectory()'。 –

回答

1

我測試你的代碼,它按預期工作。我的唯一區別是我使用了一個真實的設備,所以我的文件的路徑是/storage/sdcard0/Download/real-file-name.jpg。我建議你檢查該文件中的仿真器存儲器中存在:

adb shell ls /storage/emulated/0/Download/real-file-name.jpg

輸出應該是這樣的:

-rw-rw-r-- root sdcard_rw 21577 2016-01-26 16:16 real-file-name.jpg

這是你的代碼的輸出示例

01-26 18:00:52.877 29568-29644/com.omainegra.sof D/test: Done123 
01-26 18:00:54.383 29568-29644/com.omainegra.sof D/test: { 
                 "args": {}, 
                 "data": "", 
                 "files": { 
                  "file": "data:image/jpg;base64,/9j/4AAQSkZJRgAB... 

推薦

一個更好的(和被動的做法),可以很容易地RxAndroid

class MainActivity : AppCompatActivity() { 

    val observable = Observable.create<String> { observer -> 
     try { 
      if (!observer.isUnsubscribed) { 
       val MEDIA_TYPE_PNG = MediaType.parse("image/jpg") 
       val client = OkHttpClient() 
       val requestBody = MultipartBody.Builder() 
         .setType(MultipartBody.FORM) 
         .addFormDataPart("title", "test123") 
         .addFormDataPart("file", "image-name-123.jpg", RequestBody.create(MEDIA_TYPE_PNG, 
           File("/storage/sdcard0/Download/real-file-name.jpg"))) 
         .build() 

       val request = Request.Builder() 
         .url("http://httpbin.org/post") 
         .post(requestBody) 
         .build() 

       val response = client.newCall(request).execute(); 

       if (!response.isSuccessful) 
        throw IOException("Unexpected code " + response); 

       observer.onNext(response.body().string()) 
      } 
     } catch (e: Exception) { 
      observer.onError(e); 
     } 
    } 

    lateinit var subscription: Subscription 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 

     subscription = observable 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe({ response -> 
        Log.d("test", "Done123") 
        Log.d("test", response) 
       }, { error -> 
        Log.e("test", "onError", error) 
       }) 
    } 

    override fun onDestroy(){ 
     super.onDestroy() 
     subscription.unsubscribe() 
    } 
} 

添加依賴關係來完成你的build.gradle

compile 'io.reactivex:rxjava:1.1.0' 
compile 'io.reactivex:rxandroid:1.1.0' 
+0

或者,您可以使用SDK中提供的類來編寫最基本的成語之一,而不依賴周庫/模式的風格。 –

+0

爲什麼我在Android FileManager中看到路徑「/ storage/emulated/0/Download」,而adb表示路徑不存在,正確的路徑是「/ storage/sdcard0/Download」? –

+0

我認爲你回覆了錯誤的帖子。無論如何,Android提供'Environment.getExternalStorageDirectory()'的原因是因爲不能保證該路徑是什麼。它會依賴於設備。 –

相關問題