Android文件上传功能实现

在移动应用开发中,经常会遇到需要上传文件的场景,比如上传图片、视频等。在Android平台上,实现文件上传功能可以通过调用系统的文件选择器来选择要上传的文件,然后将选择的文件上传到服务器。本文将介绍如何在Android应用中实现选文件上传的功能,并提供代码示例。

1. 添加文件选择功能

第一步是实现文件选择功能。在Android中,可以通过Intent调用系统的文件选择器,让用户选择要上传的文件。我们可以通过以下代码实现这一功能:

// 创建一个Intent对象,设置Action为ACTION_GET_CONTENT
Intent intent = new Intent();
intent.setType("*/*"); // 设置文件类型为任意文件
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE_REQUEST_CODE);

上述代码中,我们创建了一个Intent对象,并设置了Action为ACTION_GET_CONTENT,这样系统会打开文件选择器让用户选择文件。通过startActivityForResult方法启动选择文件的Activity,并在onActivityResult方法中处理用户选择的文件。

2. 处理文件选择结果

在Activity中重写onActivityResult方法,处理用户选择的文件。我们可以通过以下代码实现文件选择结果的处理:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
  
    if (requestCode == SELECT_FILE_REQUEST_CODE && resultCode == RESULT_OK) {
        Uri selectedFileUri = data.getData();
        String filePath = getPath(selectedFileUri);
        // 在这里处理选择的文件
    }
}

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

上述代码中,我们在onActivityResult方法中获取用户选择的文件Uri,并通过getPath方法获取文件的路径。然后可以处理选择的文件,比如上传到服务器。

3. 文件上传实现

最后一步是实现文件的上传功能。可以通过HttpURLConnection或HttpClient等方式将文件上传到服务器。以下是一个使用HttpURLConnection上传文件的示例代码:

public void uploadFile(String filePath, String serverUrl) {
    try {
        File file = new File(filePath);
        URL url = new URL(serverUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "multipart/form-data");
      
        OutputStream outputStream = new BufferedOutputStream(connection.getOutputStream());
        FileInputStream fileInputStream = new FileInputStream(file);
      
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
      
        fileInputStream.close();
        outputStream.flush();
        outputStream.close();
      
        int responseCode = connection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 文件上传成功
        } else {
            // 文件上传失败
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

上述代码中,我们通过HttpURLConnection向指定的服务器地址上传文件。需要注意的是,上传文件时需要设置请求方法为POST,并设置Content-Type为multipart/form-data。

4. 完整代码示例

下面是一个完整的示例,演示了如何实现Android应用中的文件选择和上传功能:

// 在Activity中调用文件选择器
private static final int SELECT_FILE_REQUEST_CODE = 100;

private void selectFile() {
    Intent intent = new Intent();
    intent.setType("*/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
  
    if (requestCode == SELECT_FILE_REQUEST_CODE && resultCode == RESULT_OK) {
        Uri selectedFileUri = data.getData();
        String filePath = getPath(selectedFileUri);
      
        // 上传文件
        uploadFile(filePath, "
    }
}

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