在retrofit2上没有这样的文件或目录

时间:2018-03-06 05:29:53

标签: java android

我想使用RequestBody POST在retrofit2中添加文件。但是响应在呼叫响应中总是“没有这样的文件或目录”。我不知道问题出在哪里。

Manidest权限:

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

这是方法:

    public static void stackoverflowGuysHelpMePls(){


        File file = new File("android.resource://myapps.me.test/drawable/myimage");
        ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);     
         RequestBody requestFile =
                    RequestBody.create(MediaType.parse("image/*"),file);

            MultipartBody.Part body = MultipartBody.Part.createFormData("data",file.getName(),requestFile);

            Call<JsonObject> call = apiInterface.addSound4( body);
            call.enqueue(new Callback<JsonObject>() {
                @Override
                public void onResponse(Call<JsonObject> call,
                                       Response<JsonObject> response) {
                    Log.v("xxx", "success");
                }

                @Override
                public void onFailure(Call<JsonObject> call, Throwable t) {
                    Log.e("xxx", ":( "+t.getMessage());
                }
            });
    }

谢谢,

3 个答案:

答案 0 :(得分:0)

将此功能放在下面以获取文件正文对象

@NonNull
public static MultipartBody.Part prepareFilePart(String partName, String fileUri) {
    File file = new File(fileUri);
    String mimeType = URLConnection.guessContentTypeFromName(file.getName());
    RequestBody requestFile = RequestBody.create(MediaType.parse(mimeType), file);

    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}

并将此代码替换为代码

Uri fileUrl = Uri.parse("android.resource://myapps.me.test/drawable/myimage");
MultipartBody.Part body = prepareFilePart("data",fileUrl);

这样可行。

答案 1 :(得分:0)

使用此

     if (file != null) {
       RequestBody requestFile =
                RequestBody.create(MediaType.parse("multipart/form-
       data"),file);

       MultipartBody.Part body = 
       MultipartBody.Part.createFormData("data",file.getName(),requestFile);
      }

答案 2 :(得分:0)

查看评论我认为错误与无法加载资源有关,堆栈跟踪可以帮助更多地解决这个问题。

尝试传递File

,而不是使用ByteArray对象

试试这个:(kotlin)

    val resourceAsBitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
    val stream = ByteArrayOutputStream()
    resourceAsBitmap?.compress(Bitmap.CompressFormat.JPEG, 100, stream)
    RequestBody.create(MediaType.parse("image/*"), stream.toByteArray())

在java中它会是这样的:

Bitmap resourceAsBitmap = BitmapFactory.decodeResource(resources, R.drawable.test); // here use R.drawable.your_resource
ByteArrayOutputStream stream = new ByteArrayOutputStream();
if (resourceAsBitmap != null) {
    resourceAsBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream.toByteArray());
}

可能在这里或那里有一些可能的IOExceptions。