为 async-http 文件上传选择文件(uri 到文件路径)
picking file for async-http file upload (uri to file path)
我知道我的问题已经解决了多次,但我找不到任何可以帮助我解决具体问题的东西。
我打算从系统的任何地方选择一个文件:
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
我在这里接受这个意图:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
}
我有一个像这样的上传方法:
private void upload(File file){
RequestParams params = new RequestParams();
try {
params.put("fileToUpload", file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://...", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
System.out.println("statusCode "+statusCode);//statusCode 200
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
}
问题是我不知道如何 "marry" onActivity 和 upload 这两个方法,因为我不知道如何处理从 Intent 获得的信息,以便 AsyncHttpClient 可以使用它.
我尝试将 Uri 转换为绝对路径,但无法管理(在线解决方案似乎专门针对图像工作)。我也不能 "convert" 文件的 uri。
我有什么办法可以做到这一点吗?我错过了什么吗?
理想的解决方案是使用 ContentResolver
和 openInputStream()
在 Uri
标识的内容上获得 InputStream
,然后传递 InputStream
到您的 HTTP 客户端 API 用于上传。
如果您的 HTTP 客户端 API 不支持使用 InputStream
或可以从其中派生的东西(例如 Reader
),那么您需要一个 File
,在您控制的某个文件上使用 InputStream
和 FileOutputStream
来制作内容的本地副本(例如,在 getCacheDir()
中)。然后,使用您的本地副本进行文件上传操作,完成后删除本地副本。
我知道我的问题已经解决了多次,但我找不到任何可以帮助我解决具体问题的东西。
我打算从系统的任何地方选择一个文件:
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
我在这里接受这个意图:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
}
我有一个像这样的上传方法:
private void upload(File file){
RequestParams params = new RequestParams();
try {
params.put("fileToUpload", file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://...", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
System.out.println("statusCode "+statusCode);//statusCode 200
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
}
问题是我不知道如何 "marry" onActivity 和 upload 这两个方法,因为我不知道如何处理从 Intent 获得的信息,以便 AsyncHttpClient 可以使用它.
我尝试将 Uri 转换为绝对路径,但无法管理(在线解决方案似乎专门针对图像工作)。我也不能 "convert" 文件的 uri。
我有什么办法可以做到这一点吗?我错过了什么吗?
理想的解决方案是使用 ContentResolver
和 openInputStream()
在 Uri
标识的内容上获得 InputStream
,然后传递 InputStream
到您的 HTTP 客户端 API 用于上传。
如果您的 HTTP 客户端 API 不支持使用 InputStream
或可以从其中派生的东西(例如 Reader
),那么您需要一个 File
,在您控制的某个文件上使用 InputStream
和 FileOutputStream
来制作内容的本地副本(例如,在 getCacheDir()
中)。然后,使用您的本地副本进行文件上传操作,完成后删除本地副本。