7

ページでそのファイルのリンクを提供するときに、サーバーにアップロードしたファイル名を取得するにはどうすればよいですか?

私がやっていることは、webview でファイル リンクを含むデータを提供しているため、ユーザーがリンクをクリックするたびにサーバーからこのファイルをダウンロードする必要があるため、このファイルをサーバーからダウンロードする必要がありますが、DownloadManager を使用して正確なタイプと名前を取得できません。私はこのようにしたい

ここに画像の説明を入力

上記を参照して、test_androt でファイルのリンクを指定しました。クリックすると、ファイル名を持つオプションを含むダイログが表示されます。ユーザーが WebView URL リンクをクリックしたときに、このファイル名を取得する方法がわかりません。

編集 申し訳ありませんが、私の URL が次のようになっていることを忘れてしまいました

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM=
4

4 に答える 4

10

ラグナンダンの提案のおかげで答えが得られました。

ここでは、ダウンロード ファイルのヘッダー情報を取得するために追加の呼び出しが必要です。ヘッダー セクションで、ファイルの名前を取得しました。

また、このFilename from URL にはファイル名サフィックスの投稿が含まれていないことがわかりました。これにより、要求時に取得できるヘッダーの詳細に関する詳細を取得できました。

これを使用できますURLUtil.guessFileName(url, null, null)が、これには私の場合の呼び出し手段のファイル名が与えられます。私はこのようなURLを持っています

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM=

したがって、上記のリンクからdnload.phpがファイル名として抽出されます。これは、ダウンロードした元のファイル名ではなく、そのファイルのダウンロード リンクを作成したばかりです。

これを使用するコードは、ファイル名を取得できます。情報を取得するための追加の呼び出しですが、実際にはダウンロードします。

Content-Disposition this is the attribute in header section through which we can get the file name as in attachment form.

このように情報が返されるContent-Disposition: attachment; filename="fname.ext"ので、ファイル名を抽出するだけです

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

                String depo = conn.getHeaderField("Content-Disposition");
                String depoSplit[] = depo.split("filename=");
                filename = depoSplit[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) {
        super.onPostExecute();
        // use result as file name
    }
}
于 2013-04-16T05:22:36.117 に答える