Как получить имя файла при нажатии на URL в webview

Как получить имя файла, которое мы загрузили на сервер, когда мы предоставили ссылку для этого файла на странице?

То, что я делаю, я предоставляю данные с ссылкой на файл в webview, поэтому всякий раз, когда пользователь нажимает ссылку, необходимо загрузить с сервера, поскольку я загрузил этот файл с сервера, но проблема не в том, чтобы получить его точный тип и имя, используя DownloadManager. я хочу так

Введите описание изображения здесь

См. Выше. Я дал ссылку для своего файла в test_androt, и когда я нажму, он предоставит dailog с параметром, имеющим имя файла, я не знаю, как достичь этого имени файла, когда пользователь нажимает ссылку URL WebView.

Изменить Извините, что забыл упомянуть, что мой URL-адрес выглядит так

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

Solutions Collecting From Web of "Как получить имя файла при нажатии на URL в webview"

Вы могли бы просто проанализировать URL-адрес и получить текст после последнего «/» и сделать это имя файла, или вы могли бы использовать следующие

 URLUtil.guessFileName(url, contentDisposition, mimetype); 

Показан ниже, поскольку я использовал его в моем 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 } 

Если вы не хотите использовать его в своем DownloadListener, вы можете использовать его без contentDisposition или mimetype, просто передав «null» для каждого параметра, кроме URL-адреса (также передайте URL-адрес).

EDIT: Это работает только в том случае, если у вас есть url с именем файла, встроенным в него. См. Ответ Пратика выше, если вы ищете более надежный способ.

Я получил ответ благодаря Рагхунандану за предложение.

Здесь мне нужно дополнительно позвонить, чтобы получить информацию заголовка загружаемого файла. В разделе заголовка я получил имя файла.

Также я нашел это имя файла из URL, не содержащего суффикс имени файла, через который я получил более подробную информацию о деталях заголовка, которые мы можем получить в требуемое время.

Поскольку мы можем использовать это URLUtil.guessFileName(url, null, null) но это даст имя имени вызывающего средства для моего случая. У меня есть URL-адрес, подобный этому

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

Поэтому из приведенной выше ссылки будет извлечено dnload.php в качестве имени файла, а не оригинальное имя файла, которое мы загружаем, просто создала ссылку для скачивания для этого файла.

Вот код, используя это, мы можем получить имя файла, это просто дополнительный вызов, чтобы получить информацию, но на самом деле мы загружаем, для загрузки. Я использовал андроид inbuilt api для DownloadManager для загрузки файла.

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

Он будет возвращать такую ​​информацию Content-Disposition: attachment; filename="fname.ext" Content-Disposition: attachment; filename="fname.ext" так что теперь просто нужно извлечь имя файла

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

Некоторые уточнения для решения Пратика.

Изменения:

1) Исправлено разбитое имя файла из Content-Disposition

2) добавлен интерфейс обратного вызова

Применение:

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

Код:

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