OkHttp3 を用いて、Android 端末の「ピクチャ」フォルダから、画像ファイルを選択し、サーバーにアップロードすることを考えています。
ファイル選択ダイアログを開き、ユーザーがファイルを選択し、決定した際に実行される関数の中身を抜粋しています。(実際には実行時パーミッション等の処理がありもう少し複雑です)
kotlin
1val file = File(crop_uri.toString()) 2val filename = file.name 3val boundary = System.currentTimeMillis().toString() 4 5val contentResolver = this.contentResolver 6val mimeType = contentResolver.getType(crop_uri) 7val mediaType = mimeType?.toMediaTypeOrNull() 8 9if (mediaType != null) { 10 11 val requestBody: RequestBody = MultipartBody.Builder(boundary).setType(MultipartBody.FORM) 12 .addFormDataPart("file", filename, file.asRequestBody(mediaType)) 13 .build() 14 15 val url = resources.getString(R.string.url_upload_file) 16 17 val request = Request.Builder() 18 .url(url) 19 .post(requestBody) 20 .build() 21 22 client.newCall(request).enqueue(object : Callback { 23 24 override fun onFailure(call: Call, e: IOException) { 25 println("ネットワークエラー: ${e.message}") 26 } 27 28 override fun onResponse(call: Call, response: Response) { 29 if (response.isSuccessful) { 30 println("ファイルがアップロードされました") 31 } else { 32 println("アップロード中にエラーが発生しました: ${response.code}") 33 } 34 response.close() 35 } 36 }) 37}
デバッガでは、
file = {File@28789} "content:/com.android.providers.media.documents/document/image%3A1000000034" filename = "image%3A1000000034" boundary = "1699448759165" contentResolver = {ContextImpl$ApplicationContentResolver@28792} mimeType = "image/jpeg" mediaType = {MediaType@28794} image/jpeg
となっています。
エラーですが、onFailure に行ってしまいます。
2023-11-08 21:56:10.302 14056-14056 System.out com.*****.***** I ここまでOK 2023-11-08 21:56:10.331 14056-14215 okhttp.OkHttpClient com.*****.***** I --> POST https://hogehoge.com/upload_file.php 2023-11-08 21:56:10.331 14056-14215 okhttp.OkHttpClient com.*****.***** I Content-Type: multipart/form-data; boundary=1699448170298 2023-11-08 21:56:10.332 14056-14215 okhttp.OkHttpClient com.*****.***** I Content-Length: 161 2023-11-08 21:56:10.333 14056-14215 System.out com.*****.***** I ネットワークエラー: content:/com.android.providers.media.documents/document/image%3A1000000034: open failed: ENOENT (No such file or directory)
となります。
ファイルを開くことに失敗しているようですが、理由がわかりません。
実行時パーミッションにより、android.Manifest.permission.READ_MEDIA_IMAGES は granted です。
url は投稿上 hogehoge にしていますが、実際の動作では、存在する URL です。
開発環境は、以下のとおりです。
同じ課題で躓かれた方がいらっしゃいましたら、よろしくお願いします。
Android Studio Giraffe | 2022.3.1 Patch 2
targetSdk 34
Android Gradle Plugin Version 8.1.2
Gradle Version 8.4
OkHttp Version 4.9.3
回答1件
あなたの回答
tips
プレビュー