2013-04-08 9 views
7

Come ottenere il nome del file che abbiamo caricato sul server quando forniamo link per quel file nella pagina?Come ottenere il nome del file quando si fa clic sull'URL nella visualizzazione Web

Quello che sto facendo è che sto fornendo dati con collegamento file in webview così ogni volta che l'utente fa clic sul collegamento è necessario scaricare dal server poiché ho scaricato questo file dal server ma il problema non è in grado di ottenere il suo esatto tipo e nome usando DownloadManager. Voglio come questo

enter image description here

Vedere al precedente ho dato collegamento per il mio file in test_androt e quando lo scatto darà la dailog con l'opzione avere il nome del file, non so come raggiungere questo obiettivo nome del file quando l'utente fa clic sul collegamento URL WebView.

Modifica Mi dispiace dimenticato menzionare che il mio URL simile a questa

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

fare si effettua una richiesta HTTP per scaricare il file. In tal caso, è possibile ottenere il nome file dal contenuto dell'intestazione. – Raghunandan

risposta

9

Ho ricevuto la risposta grazie a Raghunandan per il suggerimento.

Qui ho bisogno di chiamare in più per ottenere le informazioni di intestazione del file di download. Nella sezione dell'intestazione ho ottenuto il nome del file.

Inoltre ho trovato questo post Filename from URL not containing filename suffix attraverso il quale ho ottenuto maggiori dettagli riguardo i dettagli dell'intestazione che possiamo ottenere al momento della richiesta.

Come possiamo usare questo URLUtil.guessFileName(url, null, null) ma questo sarà dato il nome di file di mezzi chiedendo mio caso ho URL come questo

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

così dal link qui sopra questo estrarrà il dnload.php come nome del file non il nome del file originale che lo abbiamo scaricato appena creato il link per il download di quel file.

ecco il codice utilizzando questo possiamo ottenere il nome del file è solo una chiamata in più per ottenere le informazioni, ma in realtà noi scarichiamo, per il download ho usato android inbuilt api per DownloadManager per scaricare il file.

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

Sarà tornerà informazioni come questo senso Content-Disposition: attachment; filename="fname.ext" così ora solo bisogno di estrarre il nome del file

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

Considera ['setRequestMethod (" HEAD ")'] (http://developer.android.com/reference/java/net/HttpURLConnection.html#setRequestMethod (java.lang.String)) invece di una richiesta 'GET' dal vuoi solo le intestazioni. Inoltre, per il caso più generale, ricorda che 'depo' potrebbe essere nullo,' depo' potrebbe essere presente ma non avere nome file, o il nome file potrebbe essere codificato tramite URL dal server a causa [del comportamento non standard dell'onnipresente Internet Explorer] (http://stackoverflow.com/q/93551/687315). – user113215

+0

@Pratik: Ho provato l'approccio sopra, ma nel mio caso non ha funzionato. Potete aiutarmi in relazione alla mia domanda qui: http://stackoverflow.com/questions/24577166/get-the-file-image-name-from-the-url-which-does-not-end-with-a- file-name-and-ext –

10

Si potrebbe semplicemente analizzare l'URL e ottenere il testo dopo l'ultima "/" e fare che il nome del file, oppure si potrebbe utilizzare il seguente

URLUtil.guessFileName(url, contentDisposition, mimetype); 

di seguito riportiamo come ho usato nel mio DownloadListener:

//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 
} 

Se non si desidera utilizzarlo all'interno di DownloadListener, è possibile utilizzarlo senza contentDisposition o mimetype passando semplicemente "null" in per ogni parametro tranne l'url (passa anche l'url in).

MODIFICA: funziona solo se si dispone di un URL con un nome file incorporato. Vedi la risposta di Pratik sopra se stai cercando un modo più infallibile.

0

Alcuni filtri per la soluzione di Pratik.

Modifiche:

1) estrazione nome del file rotto fisso da Content-Disposition

2) ha aggiunto l'interfaccia di callback

Usage:

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

Codice:

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 per recuperare manualmente il nome del file:

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

Codice:

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); 
    } 
Problemi correlati