2017-01-24 4 views
1

私の問題はすでに何回も取り組まれてきたことは知っていますが、私の特定の問題を助けてくれるものは見つかりませんでした。async-httpファイルアップロード用のファイルを選ぶ(ファイルパスへのURL)

私はどこでもシステムからファイルを選択する意図を持っている:

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(); 

}

をし、私のようなアップロード方法を持っていますso:

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

     } 
    }); 
} 

問題は、AsyncHttpClientが使用できるようにインテントから取得した情報をどのように処理するかわからないため、2つのメソッドonActivityとアップロードを「結婚」する方法がわかりません。

私はUriを絶対パスに変換しようとしましたが、管理することはできませんでした(画像の場合は特に問題なく動作するソリューション)。私はまた、uriをファイルに "変換"することもできません。

私はこれを行うことができますか?何か不足していますか?

答えて

3

理想的なソリューションは、アップロードで使用するために、あなたのHTTPクライアントAPIにそのInputStreamを渡し、Uriによって識別されるコンテンツのInputStreamを取得するためにContentResolveropenInputStream()を使用することです。

あなたのHTTPクライアントAPIはInputStreamの使用または1(例えば、Reader)から導出することができるようなものをサポートしていない、とあなたがFileを必要とする、あなたがコントロールするいくつかのファイルにそのInputStreamFileOutputStreamを使用している場合コンテンツのローカルコピーを作成してください(例:getCacheDir())。次に、ファイルのアップロード操作にローカルコピーを使用し、完了したらローカルコピーを削除します。

+0

はい、ありがとうございます。Async-Httpでは、ファイルではなく入力ストリームが許可されています。 – hachel

関連する問題