2017-01-24 5 views
1

Ich weiß, dass mein Problem bereits mehrfach angegangen wurde, aber ich konnte nichts finden, das mir mit meinem spezifischen Problem helfen würde.Kommissionierdatei für async-http Datei-Upload (uri zu Dateipfad)

Ich habe eine Absicht, eine Datei an beliebiger Stelle aus dem System zu holen:

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


} 

ich diese Absicht hier abholen:

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

}

und ich habe eine Upload-Methode wie 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) { 

     } 
    }); 
} 

das Problem ist, dass ich nicht weiß, wie man die beiden Methoden onActivity "heiratet" und hochläd, weil ich nicht weiß, wie man die Information verarbeitet, die ich von der Absicht bekomme, damit der AsyncHttpClient sie verwenden kann.

Ich habe versucht, die URI zu einem absoluten Pfad zu konvertieren, konnte aber nicht verwalten (die Online-Lösungen, die speziell für Bilder zu funktionieren schienen). Ich kann das uri auch nicht in eine Datei "umwandeln".

Irgendwie könnte ich das tun? Fehle ich etwas?

Antwort

3

Die ideale Lösung ist ContentResolver und openInputStream() zu verwenden, um ein InputStream auf dem Inhalt der Uri identifiziert zu bekommen, passiert dann, dass InputStream auf Ihren HTTP-Client-API für die Verwendung in dem Hochladen.

Wenn Ihr HTTP-Client-API nicht die Verwendung von InputStream oder etwas unterstützen, die von einem (zB Reader) abgeleitet werden könnten, und so müssen Sie einen File, verwenden Sie das InputStream und ein FileOutputStream auf einige Datei, die Sie steuern eine lokale Kopie des Inhalts erstellen (z. B. in getCacheDir()). Verwenden Sie dann Ihre lokale Kopie für den Dateiuploadvorgang, und löschen Sie die lokale Kopie, wenn Sie fertig sind.

+0

Ja, danke, Async-Http ermöglicht einen Eingabestrom anstelle einer Datei. – hachel