2013-04-08 14 views
7

Wie Sie die Dateinamen zu erhalten, die wir auf dem Server hochgeladen, wenn wir für diese Datei in Seite verlinkt bieten?Wie Dateinamen erhalten, wenn auf URL in webview klicken

Was ich tue ist, ich biete Daten mit Dateilink in Webview, so wenn Benutzer klicken auf Link müssen vom Server herunterladen, wie ich diese Datei vom Server herunterladen, aber das Problem ist nicht in der Lage, seinen genauen Typ zu erhalten Verwenden Sie den DownloadManager. Ich möchte ähnliche

enter image description here

in Siehe oben I Link für meine Datei in test_androt gegeben haben, und wenn ich auf wird es die dailog mit der Option, die den Dateinamen geben, ich weiß nicht, wie dies zu erreichen Dateiname, wenn der Benutzer auf den WebView-URL-Link klickt.

bearbeiten Leider vergaß zu erwähnen, dass meine URL dieses aussehen wie

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM= 
+2

haben Sie eine HTTP-Anforderung, um die Datei herunterzuladen. Wenn ja, dann können Sie den Dateinamen aus dem Header-Inhalt abrufen. – Raghunandan

Antwort

9

bekam ich die Antwort dank Raghunandan für Vorschlag.

Hier muß ich zusätzlichen Aufruf die Header Informationen der Download-Datei zu erhalten. Im Kopfbereich habe ich den Namen der Datei erhalten.

Auch fand ich diesen Filename from URL not containing filename suffix Post, durch die ich ausführlicher in Bezug auf Kopfdetail bekam die wir anfordernden Zeit bekommen kann.

Da wir diesen URLUtil.guessFileName(url, null, null) verwenden können, aber das wird den Dateinamen des Anrufers Mittel für meinen Fall gegeben Ich habe URL wie diese

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM= 

so aus dem obigen Link wird extrahiert dies die dnload.php als Dateiname Es ist nicht der ursprüngliche Dateiname, den wir herunterladen, nur den Download-Link für diese Datei erstellt.

Hier ist der Code mit dieser können wir den Dateinamen erhalten, es ist nur ein zusätzlicher Aufruf, um die Informationen zu erhalten, aber tatsächlich laden wir, zum Download habe ich Android inbuilt API zum DownloadManager verwendet, um die Datei herunterzuladen.

Content-Disposition this is the attribute in header section through which we can get the file name as in attachment form. 

Es wird wird Informationen wie auf diese Weise zurückkehren Content-Disposition: attachment; filename="fname.ext" so jetzt müssen nur Dateinamen

class GetFileInfo extends AsyncTask<String, Integer, String> 
{ 
    protected String doInBackground(String... urls) 
    { 
       URL url; 
       String filename = null; 
       try { 
        url = new URL(urls[0]); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       conn.connect(); 
       conn.setInstanceFollowRedirects(false); 

       String depo = conn.getHeaderField("Content-Disposition"); 
       String depoSplit[] = depo.split("filename="); 
       filename = depoSplit[1].replace("filename=", "").replace("\"", "").trim(); 
       } catch (MalformedURLException e1) { 
        e1.printStackTrace(); 
       } catch (IOException e) { 
       } 
      return filename; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(); 
     // use result as file name 
    } 
} 
+0

Betrachten Sie ['setRequestMethod (" HEAD ")'] (http://developer.android.com/reference/java/net/HttpURLConnection.html#setRequestMethod (java.lang.String)) anstelle einer 'GET'-Anfrage seit Sie wollen nur die Header. Denken Sie auch daran, dass "depo" für den allgemeineren Fall null sein könnte, "depo" könnte vorhanden sein, aber keinen Dateinamen haben, oder der Dateiname könnte vom Server aufgrund des nicht standardmäßigen Verhaltens des ubiquitären URL-Codes codiert werden Internet Explorer] (http://stackoverflow.com/q/93551/687315). – user113215

+0

@Pratik: Ich habe den obigen Ansatz versucht, aber es hat in meinem Fall nicht funktioniert. Können Sie mir im Zusammenhang mit meiner Frage hier helfen: http://stackoverflow.com/questions/24577166/get-the-file-image-name-from-the-url-which-does-not-end-with-a- Dateiname-und-ext –

10

Sie könnten einfach die URL analysieren und den Text nach dem letzten „/“ erhalten und dass Sie den Dateinamen, oder Sie verwenden sie die folgende könnte

URLUtil.guessFileName(url, contentDisposition, mimetype); 

unten, wie ich es in meinem DownloadListener verwendet haben:

//this stuff goes inside your DownloadListener 
@Override 
public void onDownloadStart(final String url, String userAgent,final String contentDisposition, final String mimetype, long contentLength) 
{ 
    String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); //returns a string of the name of the file THE IMPORTANT PART 

    //proceed with download 
} 

Wenn Sie es in Ihrem DownloadListener nicht verwenden möchten, können Sie es ohne die contentDisposition oder MIME-Typen von gerade vorbei ‚null‘ in für jeden Parameter mit Ausnahme der URL verwenden können (mit der die URL in) auch.

EDIT: Dies funktioniert nur, wenn Sie eine URL mit einem Dateinamen in sie eingebettet sind. Siehe Pratiks Antwort oben, wenn Sie nach einem narrensichereren Weg suchen.

0

Einige Verfeinerungen für Pratik Lösung extrahieren.

Änderungen:

1) fixiert gebrochenen Dateinamen Extraktion von Content-Disposition

2) hinzugefügt Callback Interface

Usage:

new GetFileInfo(new GetFileInfoListener() { 
    @Override 
    public void onTaskCompleted(String fileName) { 
     Log.v(TAG, "real filename is " + fileName); 
    } 
}).execute(url); 

Code:

class GetFileInfo extends AsyncTask<String, Integer, String> 
{ 
    public interface GetFileInfoListener { 
     void onTaskCompleted(String result); 
    } 

    private final GetFileInfoListener mListener; 

    public GetFileInfo(GetFileInfoListener listener) { 
     mListener = listener; 
    } 

    protected String doInBackground(String... urls) 
    { 
     URL url; 
     String filename = null; 
     try { 
      url = new URL(urls[0]); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.connect(); 
      conn.setInstanceFollowRedirects(false); 

      String depo = conn.getHeaderField("Content-Disposition"); 

      if (depo != null) 
       filename = depo.replaceFirst("(?i)^.*filename=\"?([^\"]+)\"?.*$", "$1"); 
      else 
       filename = URLUtil.guessFileName(urls[0], null, null); 
     } catch (MalformedURLException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e) { 
     } 
     return filename; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if (mListener != null) 
      mListener.onTaskCompleted(result); 
    } 
} 
0

AsyncTask manuell den Dateinamen abzurufen:

private static class getFileNameAsync extends AsyncTask<String, Void, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     URL url; 
     String filename = null; 
     HttpURLConnection conn = null; 
     try { 
      url = new URL(params[0]); 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.connect(); 
      conn.setInstanceFollowRedirects(false); 

      try { 
       for(int i = 0; i < 100; i++) 
       { 
        String stringURL = conn.getHeaderField("Location"); 
        if (stringURL != null) { 
         url = new URL(stringURL); 
         conn = (HttpURLConnection) url.openConnection(); 
         conn.connect(); 
         conn.setInstanceFollowRedirects(false); 
        } else { 
         i = 100; 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      String depo = conn.getHeaderField("Content-Disposition"); 
      if (depo != null) { 
       String depoSplit[] = depo.split(";"); 
       int size = depoSplit.length; 
       for(int i = 0; i < size; i++) 
       { 
        if(depoSplit[i].startsWith("filename=")) 
        { 
         filename = depoSplit[i].replaceFirst("(?i)^.*filename=\"?([^\"]+)\"?.*$", "$1").trim(); 
         i = size; 
        } 
       } 
      } 
     } catch (MalformedURLException e){ 
      e.printStackTrace(); 
     } catch (ProtocolException e){ 
      e.printStackTrace(); 
     } catch (FileNotFoundException e){ 
      e.printStackTrace(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } finally { 
      if (conn != null) 
       conn.disconnect(); 
     } 
     return filename; 
    } 
    @Override 
    protected void onPostExecute(String filename) { 
     super.onPostExecute(filename); 
    } 
} 

Code:

String url = "Put your url hear"; 
    String fileName = ""; 
    url = url.replace(" ", "%20"); 

    AsyncTask<String, Void, String> asyncTask = new getFileNameAsync(); 
    asyncTask.execute(url); 

    try { 
     fileName = asyncTask.get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } catch (CancellationException e) { 
     e.printStackTrace(); 
    } 
    if ((fileName == null) || (fileName.hashCode() == "".hashCode())) { 
     fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); 
    } 
Verwandte Themen