选择async-http文件上传文件(uri到文件路径)

时间:2017-01-24 21:01:59

标签: java android android-intent android-async-http

我知道我的问题已经多次解决,但我找不到任何可以帮助我解决特定问题的事情。

我打算从系统中的任何地方选择一个文件:

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) {

        }
    });
}

问题是我不知道如何结婚"关于活动和上传的两种方法,因为我不知道如何处理从intent获得的信息,以便AsyncHttpClient可以使用它。

我尝试将Uri转换为绝对路径,但无法管理(在线解决方案似乎适用于专门用于图像的解决方案)。我也不能"转换" uri到文件。

我能做到这一点吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

理想的解决方案是使用ContentResolveropenInputStream()获取InputStream标识的内容Uri,然后将InputStream传递给您用于上传的HTTP客户端API。

如果您的HTTP客户端API不支持使用InputStream或某些内容(例如Reader),那么您需要File,请使用InputStreamFileOutputStream在您控制的某个文件上制作内容的本地副本(例如,在getCacheDir()中)。然后,使用本地副本进行文件上载操作,并在完成后删除本地副本。