簡體   English   中英

使用翻新2上傳文件時出錯

[英]Error uploading file with Retrofit 2

我正在工作的系統有一個接收文件圖片的端點,以便設置用戶的個人資料圖片。 如果我嘗試通過郵遞員發送,一切正常:

在此處輸入圖片說明

當我嘗試使用改造從我的應用程序上載它時,它總是失敗。 代碼和堆棧跟蹤如下:

服務器端代碼:

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上找到該文件。 我試圖從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

根據用戶Anurag Singh的請求,以下是清單和操作系統信息:

    <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

這是Postman生成的代碼,效果很好!

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();

嘗試在AndroidManifest.xml添加以下權限

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

從Android 6.0(API級別23)開始,用戶在應用程序運行時(而不是在安裝應用程序時)授予應用程序權限。 在運行時請求權限

暫無
暫無

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

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