【问题标题】:Filename from URL not containing filename suffix来自 URL 的文件名不包含文件名后缀
【发布时间】:2012-10-18 00:44:18
【问题描述】:

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

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

【问题讨论】:

    标签: java android http url filenames


    【解决方案1】:

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

    【讨论】:

    • 感谢我最后所做的 :-)
    【解决方案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);
        }
    }
    

    【讨论】:

    • Content-Disposition 的解析非常原始,对于边缘情况以及非 ASCII 字符都会失败。
    猜你喜欢
    • 2013-03-23
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多