Ottenere il nome del file da un url di download in Android

Non è affatto raro che durante lo sviluppo di un’app Android, sia necessario implementare il download di un file da un sito o una webapp preesistente e che la cosa vada gestita senza potere usufruire di un webservice rest. Niente json, nessun informazione su ciò che dobbiamo scaricare nella nostra app. Pensiamo ad esempio ad una form di upload che ammette un solo file immagine, le cui estensioni ammesse sono più di una (.jpeg, .gif, .bmp, .png ecc.), e che deve rimanere sincronizzato con lo storage locale della nostra app. Immaginiamo di dover caricare questo successivamente questo file in una ImageView. Avere nome file ed estensione al momento del salvataggio potrebbe farci molto comodo. Un possibile approccio potrebbe essere quello di ottenere il nome del file da un url di download.

Ottenere il nome del file dalla response header tramite HttpUrlConnection

Iniziamo con l’instanziazione dell’url, ad esempio:

String url = "http://www.example.com/download?id=12312";
URL u = new URL(url );

Successivamente otteniamo i cookie tramite la classe CookieManager del package android.webkit

String cookie = CookieManager.getInstance().getCookie(url);

Apriamo quindi la connessione http e impostiamo i cookie e il metodo HEAD:

HttpURLConnection cn = (HttpURLConnection) u.openConnection();
cn.setRequestProperty("Cookie", cookie);
cn.setRequestMethod("HEAD");
cn.setInstanceFollowRedirects(false);
cn.connect();

A questo punto, dobbiamo ottenere il campo Content-dispostion dagli header

String content = con.getHeaderField("Content-Disposition");

Siamo ad un passo dall’ottenere il nome del file che vogliamo scaricare. Non ci resta che depurare la stringa dai contenuti che non ci interessano tramite una banalissima regex

String contentArray[] = content.split("filename=");

Non resta che rimuovere dal secondo elemento dell’array ottenuto slash e spazi finali

String myFilename = contentArray[1].replace("filename=", "").replace("\"", "").trim();