实现 Android 请求参数传 file

作为一名经验丰富的开发者,我将向你介绍如何在 Android 中实现请求参数传递文件。这个过程可以分为以下几个步骤:

1. 添加文件读写权限

在 AndroidManifest.xml 文件中添加以下权限,以便应用可以读写文件:

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

2. 创建文件选择器

你可以使用 Android 提供的 Intent.ACTION_GET_CONTENT 动作创建文件选择器,让用户选择需要上传的文件。代码如下:

public void selectFile() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*"); // 选择所有文件类型
    startActivityForResult(intent, FILE_REQUEST_CODE);
}

3. 处理文件选择结果

当用户选择了文件后,会返回一个文件的 URI。在 onActivityResult 方法中,你可以处理选择文件的结果。代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    if (requestCode == FILE_REQUEST_CODE && resultCode == RESULT_OK) {
        if (data != null && data.getData() != null) {
            Uri fileUri = data.getData();
            String filePath = getFileRealPath(fileUri); // 获取文件的真实路径
            
            // 在这里执行上传文件的操作
            uploadFile(filePath);
        }
    }
}

private String getFileRealPath(Uri fileUri) {
    String filePath = "";
    
    if (fileUri.getScheme().equals("content")) {
        Cursor cursor = getContentResolver().query(fileUri, null, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            int index = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
            filePath = cursor.getString(index);
            cursor.close();
        }
    } else if (fileUri.getScheme().equals("file")) {
        filePath = fileUri.getPath();
    }
    
    return filePath;
}

在上述代码中,getFileRealPath 方法用于获取文件的真实路径。根据文件 URI 的不同 scheme,我们需要进行不同的处理。

4. 实现文件上传功能

最后,我们需要实现文件上传的功能。在这里,我将使用 Retrofit 来完成文件上传的操作。首先,我们需要添加 Retrofit 的依赖:

implementation 'com.squareup.retrofit2:retrofit:2.x.x'
implementation 'com.squareup.retrofit2:converter-gson:2.x.x'
implementation 'com.squareup.okhttp3:okhttp:4.x.x'

接下来,定义一个 Retrofit 接口来处理文件上传的请求:

public interface FileUploadService {
    @Multipart
    @POST("upload")
    Call<ResponseBody> uploadFile(
        @Part("file\"; filename=\"image.jpg\" ") RequestBody file
    );
}

在这个示例中,我们假设上传的文件名为 image.jpg。你可以根据实际需求修改文件名。

最后,我们可以使用 Retrofit 来发送文件上传请求:

private void uploadFile(String filePath) {
    File file = new File(filePath);
    RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
    MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
    
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .build();
    
    FileUploadService service = retrofit.create(FileUploadService.class);
    Call<ResponseBody> call = service.uploadFile(filePart);
    
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            // 处理上传成功的逻辑
            if (response.isSuccessful()) {
                // 文件上传成功
            } else {
                // 文件上传失败
            }
        }
        
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            // 处理上传失败的逻辑
        }
    });
}

在上述代码中,我们创建了一个 Retrofit 实例,并使用该实例创建了一个 FileUploadService 的实例。然后,我们调用 uploadFile 方法来发送文件上传请求。在 onResponse 和 onFailure 方法中,你可以处理上传成功和失败的逻辑。

以上就是实现 Android 请求参数传递文件的完整步骤。通过文件选择器选择文件,获取文件的真实路径后,使用 Retrofit 进行文件上传操作。