首页 > 解决方案 > 错误:415 - 尝试使用 python 作为后端上传图像时,android 中出现不支持的媒体类型错误

问题描述

我无法弄清楚为什么我会收到 415 响应。我只是想上传多个文件。我要上传的文件格式是 .jpg,我的后端支持它。

改造服务

@Multipart
    @POST("http://localhost/service/request/upload")
    Call <ResponseBody> uploadImages(@Header ("Authorization") String token, @Header("Content-Type") String type, @Part MultipartBody.Part file1, @Part MultipartBody.Part file2);

改造方法

private void uploadMultipleFiles() {

        SharedPreferences preferences = getApplicationContext().getSharedPreferences("MY_APP", Context.MODE_PRIVATE);
        String retrivedToken = "Token " + preferences.getString("TOKEN", null);
        String attachment_one = preferences.getString("Attachement_one", null);
        String attachement_two = preferences.getString("Attachement_two", null);

        File file_one = new File(attachment_one);
        File file_two = new File(attachement_two);
        
        RequestBody requestBody1 = RequestBody.create(MediaType.parse("*/*"), file_one);
        RequestBody requestBody2 = RequestBody.create(MediaType.parse("*/*"), file_two);

        MultipartBody.Part fileToUpload1 = MultipartBody.Part.createFormData("file1", file_one.getName(), requestBody1);
        MultipartBody.Part fileToUpload2 = MultipartBody.Part.createFormData("file2", file_two.getName(), requestBody2);

        Call<ResponseBody> call = ServiceBuilder.getInstance().getApi().uploadImages(retrivedToken,"application/json", fileToUpload1, fileToUpload2);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (!response.isSuccessful()) {
                    System.out.println("Response Code: " + response.code());
                    return;
                } else {
                    System.out.println("Response Code: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                System.out.println("Message: " + t.getMessage());
            }
        });
    }

上传文件的代码

attach_file.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 10001);
        }
        new MaterialFilePicker().withActivity(ServiceDetails.this).withRequestCode(1).withFilter(Pattern.compile(".*\\.(mkv|wmv|avi|mpeg|swf|mov|mp4|jpg|jpeg)$")).withHiddenFiles(true) // Show hidden files and folders
        .start();
    }
    });
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1 && resultCode == RESULT_OK) {
            String file_path = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);
            File source = new File(file_path);
            SharedPreferences preferences = getApplicationContext().getSharedPreferences("MY_APP", Context.MODE_PRIVATE);

            if (attachment_one.getText().toString().isEmpty()) {
                preferences.edit().putString("Attachement_one", String.valueOf(source)).apply();
            } else if (attachment_two.getText().toString().isEmpty()) {
                preferences.edit().putString("Attachement_two", String.valueOf(source)).apply();
            }
        }
    }

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 10001: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(ServiceDetails.this, "Permission granted", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(ServiceDetails.this, "Permission not granted", Toast.LENGTH_LONG).show();
                    finish();
                }
            }
        }
    }

我是安卓新手。请帮我解决这个问题。百万提前感谢:)

标签: javaandroidfileandroid-activityretrofit2

解决方案


我通过更换解决了这个问题

Call<ResponseBody> call = ServiceBuilder.getInstance().getApi().uploadImages(retrivedToken,"application/json", fileToUpload1, fileToUpload2);

Call<ResponseBody> call = ServiceBuilder.getInstance().getApi().uploadImages(retrivedToken, "multipart/form-data", fileToUpload1, fileToUpload2);

推荐阅读