Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java URL中的文件名不包含文件名后缀_Java_Android_Http_Url_Filenames - Fatal编程技术网

Java URL中的文件名不包含文件名后缀

Java URL中的文件名不包含文件名后缀,java,android,http,url,filenames,Java,Android,Http,Url,Filenames,我需要从URL下载一个文件,但我不知道该文件的类型,并且我使用的URL末尾没有/random.file,因此我无法解析文件名的URL。 目前,我正在使用Android下载管理器,它工作得非常好,这意味着我没有处理下载的权限,但我看不到从下载的文件中获取文件名。例如,如果我在Firefox中加载相同的url,它会询问“下载文件:Nameoffile.extension” 在下载文件之前,是否有办法复制这种行为并获取文件名?您最好阅读响应上的HTTP内容类型标题,并确定它是什么类型的文件。文件扩展名

我需要从URL下载一个文件,但我不知道该文件的类型,并且我使用的URL末尾没有/random.file,因此我无法解析文件名的URL。 目前,我正在使用Android下载管理器,它工作得非常好,这意味着我没有处理下载的权限,但我看不到从下载的文件中获取文件名。例如,如果我在Firefox中加载相同的url,它会询问“下载文件:Nameoffile.extension”


在下载文件之前,是否有办法复制这种行为并获取文件名?

您最好阅读响应上的HTTP
内容类型
标题,并确定它是什么类型的文件。文件扩展名不保证文件的类型<代码>内容配置:附件;filename=“fname.ext”是另一种方法,如果您指定了文件名,则可以使用该方法。查看以了解更多信息。

您最好阅读响应上的HTTP
内容类型
标题,并确定它是什么类型的文件。文件扩展名不保证文件的类型<代码>内容配置:附件;filename=“fname.ext”是另一种方法,如果您指定了文件名,则可以使用该方法。查看以获取更多信息。

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

类GetFileInfo扩展了异步任务
{
受保护的字符串doInBackground(字符串…URL)
{
网址;
字符串文件名=null;
试一试{
url=新url(url[0]);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
连接();
conn.setInstanceFollow(假);
试一试{
对于(int i=0;i<10;i++)
{
url=新url(conn.getHeaderField(“位置”);
conn=(HttpURLConnection)url.openConnection();
连接();
conn.setInstanceFollow(假);
}
}捕获(例外e){
}
字符串depo=conn.getHeaderField(“内容处置”);
字符串depoSplit[]=depo.split(“;”);
int size=depoSplit.length;
对于(int i=0;i
我最终使用ASyncTask手动检索文件名并将其传递给下载管理器(如果有帮助的话),我就是这样做的(在实际下载文件之前,我的url经历了多次重定向):

类GetFileInfo扩展了异步任务
{
受保护的字符串doInBackground(字符串…URL)
{
网址;
字符串文件名=null;
试一试{
url=新url(url[0]);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
连接();
conn.setInstanceFollow(假);
试一试{
对于(int i=0;i<10;i++)
{
url=新url(conn.getHeaderField(“位置”);
conn=(HttpURLConnection)url.openConnection();
连接();
conn.setInstanceFollow(假);
}
}捕获(例外e){
}
字符串depo=conn.getHeaderField(“内容处置”);
字符串depoSplit[]=depo.split(“;”);
int size=depoSplit.length;
对于(int i=0;i
感谢我最后所做的一切:-)感谢我最后所做的一切:-)内容配置的解析非常原始,对于边缘情况和非ASCII字符都会失败。内容配置的解析非常原始,对于边缘情况和非ASCII字符都会失败。
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);
    }
}