在webview中点击URL时如何获取文件名

如何获得我们在页面上提供链接到该文件时,我们上传到服务器上的文件名?

我正在做的是,我提供的数据与webview中的文件链接,所以无论何时用户点击链接需要从服务器下载,因为我已经从服务器上下载这个文件,但问题是无法获得其确切的types和名称使用DownloadManager。 我想要这样

在这里输入图像说明

在上面我已经给了我的文件在test_androt链接,当我点击它会给与选项具有文件名的dailog,我不知道如何实现这个文件名时,用户点击WebView的URL链接。

编辑对不起,忘记提到我的url是这样的

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

Related of "在webview中点击URL时如何获取文件名"

您可以简单地parsingurl并获取最后一个“/”后面的文本,并将其作为文件名,或者可以使用以下

 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的情况下使用它,除了url之外的每个参数都只传入'null'。

编辑:这只适用于如果你有一个文件名embedded在其中的url。 如果你正在寻找一个更加安全的方式,请参阅上面Pratik的答案。

感谢拉古南丹的build议,我得到了答案。

在这里,我需要额外的电话来获取下载文件的标题信息。 在标题部分我得到了该文件的名称。

此外,我从URL中find这个文件名不包含文件名后缀后,通过我得到更详细的信息,我们可以在请求时获得的头细节。

正如我们可以使用这个URLUtil.guessFileName(url, null, null)但是这将给出调用手段的文件名为我的情况我有这样的url

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

所以从上面的链接这将提取dnload.php作为文件名称它不是原始文件名,我们下载它只是为该文件创build下载链接。

这里是使用这个代码,我们可以得到的文件名,它只是一个额外的电话获取信息,但实际上,我们下载,下载我已经使用android内置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 } } 

Pratik的解决scheme的一些改进。

变化:

1)从Content-Disposition中修复了破损的文件名提取

2)添加callback界面

用法:

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

AsyncTask手动检索文件名称:

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

码:

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