为 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。

我有什么办法可以做到这一点吗?我错过了什么吗?

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

如果您的 HTTP 客户端 API 不支持使用 InputStream 或可以从其中派生的东西(例如 Reader),那么您需要一个 File,在您控制的某个文件上使用 InputStreamFileOutputStream 来制作内容的本地副本(例如,在 getCacheDir() 中)。然后,使用您的本地副本进行文件上传操作,完成后删除本地副本。