0

我工作的系統有一個端點,它接收文件圖片以設置用戶的配置文件圖片。如果我試着通過郵差送它,一切工作正常:使用改裝2上傳文件時出錯

enter image description here

當我嘗試使用它改造總是失敗的,從我的應用程序上傳。代碼+堆棧跟蹤低於:

服務器端代碼:

begin 
     user = User.find(doorkeeper_token.resource_owner_id) 
     image = params[:image] 
     attachment = { 
      :filename => image[:filename], 
      :type => image[:type], 
      :headers => image[:head], 
      :tempfile => image[:tempfile] 
     } 

     image_link = "" 
     if params[:upload_type] == "profile" 
      user.profile_image = ActionDispatch::Http::UploadedFile.new(attachment) 
      image_link = get_image_path(user.id,params[:upload_type],"original",attachment[:filename]) 
      user.image_profile_original = get_image_path(user.id,params[:upload_type],"original",attachment[:filename]) 
      user.image_profile_large = get_image_path(user.id,params[:upload_type],"large",attachment[:filename]) 

/*e22*/ 
    @Multipart 
    @POST("user/upload_image") 
    fun uploadUserImage(@Header("Authorization") authHeader: String, @Part("upload_type") description: RequestBody, @Part file: MultipartBody.Part): Call<ResponseWrapper> 

fun uploadUserImage(image: Uri) { 
     val source = File(image.path) 
     val requestFile = RequestBody.create(MediaType.parse(getContext().contentResolver.getType(image)), source) 
     val body = MultipartBody.Part.createFormData("image", "profile", requestFile) 
     val description = RequestBody.create(okhttp3.MultipartBody.FORM, "profile") 
     mMessenger.uploadUserImage(getAuthorizationHeader(), description, body).enqueue(ResponseWrapperCallback(EventCatalog.e0022)) 
    } 

請求響應:

E/ResponseWrapperCallback: Failed processing request: profile: open failed: ENOENT (No such file or directory) 
E/ResponseWrapperCallback: HTTP request mapped to event e0022 finished with error 

編輯1

我認爲這個錯誤與如何實現File對象有關。如果我從Uri直接創建文件,它的真實路徑似乎不會被髮送到服務器。我說因爲上面的錯誤日誌,它說它沒有找到檢索到的設備的Uri上的文件。我試圖提取從開放的文件真實路徑,但是,從服務器錯誤日誌中已更改爲:

/storage/emulated/0/Marvel/Media/Characters/Adam Warlock.jpeg: open failed: EACCES (Permission denied) 

的辦法,我實例化與真實文件路徑的File對象是這樣的:

private fun getRealPathFromURI(contentURI: Uri): String { 
     val result: String 
     val cursor = getContext().contentResolver.query(contentURI, null, null, null, null) 
     if (cursor == null) { 
      result = contentURI.path 
     } else { 
      cursor.moveToFirst() 
      val idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA) 
      result = cursor.getString(idx) 
      cursor.close() 
     } 
     return result 
    } 

//.... 

val source = File(getRealPathFromURI(Uri)) 

編輯2

作爲每個用戶阿努拉格辛格請求,下面是清單和OS信息:

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

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.1" 

    defaultConfig { 
     applicationId "***" 
     minSdkVersion 16 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     multiDexEnabled true 
     vectorDrawables.useSupportLibrary = true 
    } 
} 

編輯3

這是正常工作的郵差生成的代碼!

OkHttpClient client = new OkHttpClient(); 

MediaType mediaType = MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); 

RequestBody body = RequestBody.create(mediaType, "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"image\"; filename=\"sample 2.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"upload_type\"\r\n\r\nprofile\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"); 

Request request = new Request.Builder() 
    .url("http://********/user/upload_image") 
    .post(body) 
    .addHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW") 
    .addHeader("authorization", "Bearer ******") 
    .addHeader("cache-control", "no-cache") 
    .addHeader("postman-token", "******") 
    .build(); 

Response response = client.newCall(request).execute(); 
+1

後,來源的價值。 –

+0

嗨@AuuragSingh你想看看它的哪一部分?我可以注意到,如果我直接從Uri創建文件,它的真實路徑不會發送到服務器。當我嘗試從Uri中提取文件的真實路徑並從中創建對象時,服務錯誤已更改爲:/ storage/emulated/0/Marvel/Media/Characters/Adam Warlock.jpeg:打開失敗:EACCES(權限被拒絕) –

+1

源代表文件路徑。我想檢查從URI獲取路徑的方式。現在基於與權限有關的新錯誤。讓我知道您正在測試的設備操作系統版本,發佈清單權限和以下compileSdkVersion,minSdkVersion,targetSdkVersion的值。謝謝 –

回答

1

嘗試添加下面的權限在AndroidManifest.xml

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

中的Android 6.0(API級別23)開始,用戶授予權限的應用程序,而應用程序正在運行,而不是當他們安裝應用程序。 Requesting Permissions at Run Time

+0

感謝您花時間幫助我解決這個不是非常簡單的問題 –