1

我需要从 URL 下载文件,但我不知道文件是什么类型,而且我使用的 URL 末尾没有 /random.file,所以我无法解析文件名。目前,我正在使用运行良好的 Android 下载管理器,这意味着我没有处理下载,但无论如何我都无法从下载的文件中获取文件名。例如,如果我在 Firefox 中加载相同的 url,它会询问“下载文件:Nameofile.extension”。

有没有办法让我在下载文件之前复制这种行为并获取文件名?

4

2 回答 2

2

您最好阅读Content-Type响应中的 HTTP 标头并弄清楚它是什么类型的文件。文件扩展名不保证文件的类型。Content-Disposition: attachment; filename="fname.ext"如果您具体了解文件名,这是另一种方法。查看HTTP 标头列表以获取更多信息。

于 2012-10-28T13:52:47.247 回答
2

我最终使用 ASyncTask 手动检索文件名并将其传递给下载管理器,如果它对任何人有帮助,我就是这样做的(我的 url 在实际文件下载之前经历了许多重定向):

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

                try {
                    for(int i = 0; i < 10; i++)
                    {
                        url = new URL(conn.getHeaderField("Location")); 
                        conn = (HttpURLConnection) url.openConnection();
                        conn.connect();
                        conn.setInstanceFollowRedirects(false);
                    }
                } catch (Exception e) {
                }

                String depo = conn.getHeaderField("Content-Disposition");
                String depoSplit[] = depo.split(";");
                int size = depoSplit.length;
                for(int i = 0; i < size; i++)
                {
                    if(depoSplit[i].startsWith("filename="))
                    {
                        filename = depoSplit[i].replace("filename=", "").replace("\"", "").trim();
                        Global.error(filename);
                        i = size;
                    }
                }
                } catch (MalformedURLException e1) {
                    e1.printStackTrace();
                } catch (IOException e) {
                }
            return filename;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
    }
}
于 2012-10-28T14:48:25.727 回答