使用Android中的DownloadManager从标头中获取文件名

时间:2014-04-14 20:39:14

标签: android android-download-manager

我正在使用DownloadManager从网址下载视频文件。

问题是,如果我使用默认文件夹下载文件,我无法在galery中看到该视频。

此外,如果我尝试使用此方法:

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, 'filename');

我需要知道下载之前的文件名,在这种情况下,我不

而且,我在网址中没有该文件的名称。

如何从标头中获取文件名并将名称传递给方法setDestinationInExternalPublicDir? 其他替代方案?

5 个答案:

答案 0 :(得分:9)

如果有人想要执行HEAD请求来获取文件名:

class GetFileName extends AsyncTask<String, Integer, String>
{
    protected String doInBackground(String... urls)
    {
        URL url;
        String filename = null;
        try {
            url = new URL(urls[0]);
            String cookie = CookieManager.getInstance().getCookie(urls[0]);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestProperty("Cookie", cookie);
            con.setRequestMethod("HEAD");
            con.setInstanceFollowRedirects(false);
            con.connect();

            String content = con.getHeaderField("Content-Disposition");
            String contentSplit[] = content.split("filename=");
            filename = contentSplit[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) {

    }
}

答案 1 :(得分:1)

小提示,Android中有一个很好的帮助方法

URLUtil.guessFileName(url, contentDisposition, contentType);

因此,在完成对服务器的调用后,从Headers获取contenttype和contentDisposition将尝试从信息中找到文件名。

答案 2 :(得分:0)

我遇到了同样的问题。我使用@rodeleon答案,但响应头中没有Content-Disposition。然后,我分析了Chrome开发人员工具中的url标头,并在响应标头中得到了“ Location”,该标头的末尾包含文件名,就像“ b / Ol / fire_mp3_24825.mp3”。所以不要使用

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

我用过

String content = con.getHeaderField("Location") 

,最后是onPostExecute

    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        String fileName = result.substring(result.lastIndexOf("/") + 1);
        // use result as file name
        Log.d("MainActivity", "onPostExecute: " + fileName);
    }

答案 3 :(得分:0)

方法URLUtil.guessFileName()(虽然还不了解Content-Disposition)和不推荐使用的类AsyncTask如今都是有问题的方法。要使用DownloadManager使下载正确入队:

  • 首先必须在任何HTTP客户端中禁用“跟随重定向”(这是线索)。
  • 然后,第一个响应将是HTTP 302(带有Location标头),而不是HTTP 200
  • 获取时,将获得带有HTTP 200标头(文件名)的Content-Disposition
  • 然后只有一个人才能加入DownloadManager(直到已经知道文件名)。

以下是我的一个示例:RepositoryFragment(GitHub客户端)。

答案 4 :(得分:-3)

    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, uri.getLastPathSegment());