2017-01-24 1 views
1

내 문제가 이미 여러 번 해결되었지만 특정 문제를 해결하는 데 도움이되는 내용을 찾을 수 없습니다.async-http 파일 업로드 파일 (파일 경로에 대한 uri)을 가져 오는 파일

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

     } 
    }); 
} 

문제는 AsyncHttpClient에서 사용할 수 있도록 의도에서 얻은 정보를 처리하는 방법을 모르므로 onActivity 및 업로드의 두 메서드를 "결혼"하는 방법을 모르겠다는 것입니다.

저는 Uri를 절대 경로로 변환하려고 시도했지만 관리 할 수 ​​없었습니다 (이미지를 위해 특별히 작동하는 것처럼 보이는 솔루션). 또한 uri를 파일로 "변환"할 수도 없습니다.

어쨌든 이것을 할 수 있습니까? 내가 놓친 게 있니?

답변

3

이상적인 솔루션은 Uri에 의해 확인 된 내용에 InputStream를 얻을 수 ContentResolveropenInputStream()을 사용하는 것입니다, 다음 통과 업로드에 사용하기 위해 HTTP 클라이언트 API에 InputStream 그.

당신의 HTTP 클라이언트 API는 하나 (예를 들어, Reader을)에서 파생 될 수있는 InputStream 또는 무언가의 사용을 지원하지 않습니다, 그래서 당신은 File을 필요로 사용하는 경우 그 InputStream와 당신이 제어 일부 파일에 FileOutputStream 콘텐츠의 로컬 복사본을 만듭니다 (예 : getCacheDir()). 그런 다음 파일 업로드 작업에 로컬 복사본을 사용하고 완료되면 로컬 복사본을 삭제하십시오.

+0

예, 감사합니다. Async-Http는 파일 대신 입력 스트림을 허용합니다. – hachel

관련 문제