2011-11-29 22 views
0

を使用してコンテンツな長さを得ることができない私は、次のコードを持っている:私はWiFi接続で動作するまでAndroidのURLConnectionのクラスは、3Gインターネット接続

URL url = new URL("http://myserver.com/getFile.php"); 
URLConnection conexion = url.openConnection(); 
conexion.connect(); 
int lenghtOfFile = conexion.getContentLength(); 

すべてが正常に動作します。 GPRS/3G接続しか利用できないときにこのコードを実行しようとすると、conexion.getContentLength()は-1を返します。

理由は何ですか?

EDIT: getHeaderFields()を使用してヘッダーを確認しました。私は3Gネットワ​​ークを使用する場合、それらは異なっています。この場合、基本的にContent-Lengthはありません。なぜサーバーが別のヘッダを返すのか?私はファイルを提供するために特別なスクリプトを使用していない、私は与えられた場所に配置されているファイルを取得します。無線LANの場合の

全体ヘッダー:

{-範囲を受け入れ= [バイト]、コネクション= [キープアライブ]、コンテンツ長= [628254]、のContent-Type = [text/plainの。キープアライブ= [タイムアウト= 15]、最終変更= [文字セット= UTF-8]、日付= [Tue、29 Nov 2011 11:22:50 GMT]、ETag = ["7a0c7-9961e-4af3f38778500" Apache/2.2.9(Debian)PHP/5.2.6-1 + lenny9、Suhosin-patch mod_python/3.3.1 Python/2.6.6 mod_ssl/2.2 0.9のOpenSSL/0.9.8oのmod_wsgi/3.3のmod_perl/2.0.4のPerl/v5.10.0]} 3Gを使用した場合の

全体ヘッダー:

{=、バイト] [=接続-範囲を受け入れ[Keep-Alive]、Content-Type = [text/plain; Keep-Alive = [timeout = 15]、Last-Modified = ["0x00000000000000000000"]、 Apache/2.2.9(Debian)PHP/5.2.6-1 + lenny9、Suhosin-patch mod_python/3.3.1 Python/2.6.6 mod_ssl/2.2 .9 OpenSSL/0.9.8o mod_wsgi/3.3 mod_perl/2.0.4 Perl/v5.10.0]、Transfer-Encoding = [chunked]、Warning = [214 warkaz-fe07 "変換が適用されました]}

+0

Accept-Encoding:gzipとHttpURLConnectionを無効にしましたか?私の場合、私はTransfer-Encodingを得ました。チャンクされ、Content-Lengthはマイナスでした。詳細については、私の答えを見てください。http://stackoverflow.com/a/23490820/1294681 – VinceStyling

答えて

1

応答にContent-Lengthヘッダーを送信してサーバーがコンテンツの長さを提供していることを確認してください。

ヘッダーからは、プロバイダがプロキシを使用してトランスフォームを行い、プロセス内のコンテンツの長さを取り除くことが明らかです。警告ヘッダーはこれを明確に示しています。別の種類のコンテンツタイプ(現在はテキスト/プレーンを取得しています)を返そうとする可能性があります。おそらく、この特定のプロキシはそれに触れません。もちろん、それは素晴らしい解決策ではありません。キャリアが何らかの形でネットワークを「最適化」しなければならないことがたくさんあります。

範囲ヘッダーを使用してHEADリクエストを試して、コンテンツサイズの球場を取得することもできます。その場合、100k、1000kなどのいくつかの範囲を推測して、サーバーがそれが許容範囲と考えるかどうかを確認します。その偽の範囲をあなたの進歩に使うことができます。繰り返しますが、これは非常に良い解決策ではありませんが、本当に進歩が必要な場合は、試してみてください。

最後に、既知の長さがない場合は、進捗状況を不明と表示するだけです。

+0

質問を更新しました。あなたが正しいです、私は3Gネットワ​​ークを使用する場合、サーバーはContent-Lengthヘッダーを送信しません – kmalmur

+0

私はあなたのケースのヘッダーを削除するプロキシが3G上に与えられた私の答えを更新しました。 – botteaap

0

new URL("http://myserver.com/getFile.php"); 

を使用して、私はあなたが設定したパーソナル・サーバを使用していると仮定して、無線LANを使用する際にお使いの携帯電話は、あなたのローカルネットワーク内にあり、それによって、あなたのサーバーを参照することができますが、あなたがGPRS経由で接続しようとしているとき/あなたのロケにアクセスしようとしている3G lサーバーをインターネットから接続します。

+0

http:// myserver。 com/getFile.phpは、私のアプリケーションでは私のローカルネットワークの外に見える働くサーバーを使用する例です。とにかく、私が持っている唯一の問題は、getConnectionLengthです。ファイルのダウンロードは動作しますが、進行状況を表示することはできません。 – kmalmur

0

これは、おそらく運送業者の制限によるものです。この値を必要としないようにしてください。 (例えば、あなたがそれを読むことができなくなるまで、inputStreamを読むことによって)。

+0

はい、もしそうなら、ファイル – kmalmur

+0

をダウンロードするときに進捗状況を表示することはできませんが、サーバや通信事業者がそれを許さない場合は、全長がわからない場合が常にあります。 – njzk2

関連する問題