9

いくつかのサーバーからいくつかのファイルをダウンロードするプログラムを作成しました。
現在、プログラムは正しく動作します。
しかし、私はそれに履歴書のサポートを追加したいと思います。
私はこのようにしていますが、結果ファイルが破損しています:

....

File fcheck=new File(SaveDir+"/"+filename);
if(resumebox.isSelected() && fcheck.exists()){
    connection.setRequestProperty("Range", "Bytes="+(fcheck.length())+"-");
}

connection.setDoInput(true);
connection.setDoOutput(true);

BufferedInputStream in = new BufferedInputStream (connection.getInputStream()); 

pbar.setIndeterminate(false);
pbar.setStringPainted(true);

java.io.FileOutputStream fos ;
if(resumebox.isSelected()){
    if(fcheck.exists()){
        if(connection.getHeaderField("Accept-Ranges").equals("bytes")){
            fos = new java.io.FileOutputStream(SaveDir+"/"+filename,true);
        }else{
            fos = new java.io.FileOutputStream(SaveDir+"/"+filename);
        }
    }else{
        fos = new java.io.FileOutputStream(SaveDir+"/"+filename);
    }
}else{
    fos = new java.io.FileOutputStream(SaveDir+"/"+filename);
}

....

再開をサポートしていることがわかっているサーバーでテストしています。
いくつかのバイトをダウンロードしました。(72720)
それから再開しようとしました。
次に、16進エディタでファイルを開きました。オフセット72720で、最初のバイトが繰り返されます。
バイト0〜36:FLV.............«..........onMetaData
バイト72720-72756:FLV.............«..........onMetaData
最初からダウンロードを開始します!
私がwgetでそれを行うと、それは正しく実行され、Content-Rangeフィールドで応答します!
wgetログに「302FOUND」と「206PartialContent」が含まれるサーバーの応答。
「302FOUND」は問題を引き起こす可能性がありますか?

何が問題ですか ?
ありがとう。

4

2 に答える 2

17

試す:

connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-");

仕様に従って範囲指定子を小文字にします。また、部分ファイルが 500 バイトの場合、バイト範囲が 0 ~ 499 であり、500 以上が必要であることを意味します。

于 2010-08-05T12:08:24.517 に答える
3

問題は次の(fcheck.length() - 1)とおりです。これは である必要がありますfcheck.length()

于 2010-08-05T12:09:11.877 に答える