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方法来上传文件