Android选择文件上传文件

在开发Android应用程序时,我们经常需要实现文件上传功能。在用户使用我们的应用程序时,他们可能需要从手机中选择一个文件并上传到服务器上。本文将介绍如何在Android应用程序中实现选择文件并上传文件的功能。

选择文件

在Android中,我们可以使用系统提供的文件选择器来让用户选择文件。以下是一个示例代码,演示了如何使用Intent启动文件选择器。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*"); // 任意类型的文件
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, FILE_SELECT_CODE);

上述代码中,我们创建了一个Intent对象,并指定了ACTION_GET_CONTENT动作。然后,我们使用setType方法指定了文件的类型,这里使用通配符*/*表示任意类型的文件。最后,我们调用startActivityForResult方法启动文件选择器。

当用户选择了一个文件后,系统会返回一个结果给我们的应用程序。我们需要在我们的Activity中重写onActivityResult方法来处理返回的结果。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == FILE_SELECT_CODE && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        // 处理选择的文件
    }
}

在onActivityResult方法中,我们首先检查requestCode是否为之前启动文件选择器时指定的值。然后,我们检查resultCode是否为RESULT_OK,表示用户成功选择了一个文件。最后,我们通过getData方法获取用户选择的文件的Uri。

上传文件

一旦我们获取到了用户选择的文件,我们就可以将其上传到服务器上了。以下是一个示例代码,演示了如何使用HTTP POST请求将文件上传到服务器。

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(SERVER_URL);

try {
    MultipartEntity entity = new MultipartEntity();
    entity.addPart("file", new FileBody(new File(filePath)));
    httpPost.setEntity(entity);

    HttpResponse response = httpClient.execute(httpPost);
    // 处理服务器响应
} catch (IOException e) {
    e.printStackTrace();
}

上述代码中,我们首先创建一个HttpClient对象和一个HttpPost对象。然后,我们创建一个MultipartEntity对象,并使用addPart方法将文件添加到请求中。接下来,我们将MultipartEntity对象设置为HttpPost对象的实体。

最后,我们使用execute方法发送HttpPost请求,并获取服务器的响应。我们可以在HttpResponse对象中获取服务器返回的响应数据,并进行相应的处理。

完整示例

以下是一个完整的示例代码,演示了如何实现选择文件并上传文件的功能。

public class MainActivity extends AppCompatActivity {

    private static final int FILE_SELECT_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button selectButton = findViewById(R.id.select_button);
        selectButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showFileChooser();
            }
        });
    }

    private void showFileChooser() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(intent, FILE_SELECT_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == FILE_SELECT_CODE && resultCode == RESULT_OK) {
            Uri uri = data.getData();
            uploadFile(uri);
        }
    }

    private void uploadFile(Uri uri) {
        String filePath = getRealPathFromURI(uri);

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(SERVER_URL);

        try {
            MultipartEntity entity = new MultipartEntity();
            entity.addPart("file", new FileBody(new File(filePath)));
            httpPost.setEntity(entity);

            HttpResponse response = httpClient.execute(httpPost);
            // 处理服务器响应
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String getRealPathFromURI(Uri uri) {
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String path = cursor.getString(column_index);
        cursor.close();
        return path;
    }
}

上述代码中,我们在布局文件中添加了一个按钮,当用户点击按钮时,会调用showFileChooser方法来打开文件选择器。在onActivityResult方法中,我们调用了uploadFile方法来上传文件