2

ファイルへの直接リンクである場合とそうでない場合がある特定の URL からファイルをダウンロードしようとしています。URL が間接リンク (つまり、 http://www.example.com/download.php?getFile=1 )である場合に書き込むファイル名を検出する方法を知っている人はいますか? URLがURLからファイル名を抽出し、抽出されたファイル名への書き込みを開始するための直接リンクである場合は問題ありませんが、リダイレクトリンクを使用すると、これまでに見つけた唯一の方法は、任意のファイル名に書き込むことです-foo.txt-そして、それを試してみてください。問題は、ファイル名 (および拡張子) を正しくする必要があることです。私が使用しているコードのサンプルは次のとおりです: (「else」句のセクションは終了も機能もしていません):

public static boolean dlFile(String URL, String dest){
    try{
        URL grab = new URL(URL);
        ReadableByteChannel rbc = Channels.newChannel(grab.openStream());
        String fnRE = ".*/([a-zA-Z0-9\\-\\._]+)$";
            Pattern pattern = Pattern.compile(fnRE);
        Matcher matcher = pattern.matcher(URL);
        String fName = "";
        if(matcher.find()) fName = matcher.group(1);
        else { //filename cannot be extracted - do something here - below doesn't work raises MalformedURLExcpetion
            URL foo = new URL(URL);
            HttpURLConnection fooConnection = (HttpURLConnection) foo.openConnection();
            URL secondFoo = new URL(fooConnection.getHeaderField("Location"));
            System.out.println("Redirect URL: "+secondFoo);
            fooConnection.setInstanceFollowRedirects(false);
            URLConnection fooURL = secondFoo.openConnection();
        }
        System.out.println("Connection to "+URL+" established!");
        if(dest.endsWith("/")){}
        else dest+="/";
        System.out.println("Writing "+fName+" to "+dest);
        FileOutputStream fos = new FileOutputStream(dest+fName);
        fos.getChannel().transferFrom(rbc, 0, 1 << 24);

ヘッダーなどからファイル名を取得する簡単な方法があるはずですが、取得方法がわかりません。前もって感謝します、

4

3 に答える 3

1

Java Jsoupライブラリを使用してから、以下の方法を使用する方がよいと思います。

public static void downloadFileJsoup(String URL, String PATH) throws IOException {
    Response res = Jsoup.connect(URL)
            .userAgent("Mozilla")
            .timeout(30000)
            .followRedirects(true)
            .ignoreContentType(true)
            .maxBodySize(20000000)//Increase value if download is more than 20MB
            .execute(); 
    String remoteFilename=res.header("Content-Disposition").replaceFirst("(?i)^.*filename=\"?([^\"]+)\"?.*$", "$1");
    String filename = PATH + remoteFilename;
    FileOutputStream out = (new FileOutputStream(new java.io.File(filename)));
    out.write( res.bodyAsBytes());
    out.close();
}
于 2020-11-03T19:34:06.227 に答える
0

いいえ、一般的にはありません。独自のプロトコル情報をデータ ストリームに追加しないため (サーバーを制御できる場合)、通常は応答にその情報は含まれません。

とにかく、ファイル名拡張子を要求します。おそらく正しいコンテンツタイプで完了です。

于 2012-11-02T10:43:37.997 に答える