1

URL からファイルをダウンロードする必要がありますが、ファイルの種類がわからず、使用している URL の末尾に /random.file がないため、URL を解析できません。ファイル名。現時点では、Androidダウンロードマネージャーを使用していますが、これはうまく機能し、ダウンロードを処理していないことを意味しますが、ダウンロード中のファイルからファイル名を取得する方法がわかりません。たとえば、Firefox で同じ URL をロードすると、「ファイルをダウンロード: Nameoffile.extension」と尋ねられます。

ファイルをダウンロードする前に、この動作を再現してファイル名を取得する方法はありますか?

4

2 に答える 2

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 に答える
2

応答の HTTPContent-Typeヘッダーを読んで、それがどのタイプのファイルであるかを判断することをお勧めします。ファイル名の拡張子は、ファイルの種類を保証するものではありません。Content-Disposition: attachment; filename="fname.ext"ファイル名について具体的な場合は、これを行う別の方法です。詳細については、HTTP ヘッダーのリストを確認してください。

于 2012-10-28T13:52:47.247 に答える