2013-04-27 10 views
34

私は現在以下のコードを使用しています。私はこの機能が初めてで、シンプルなものかもしれませんが、私のサーバーでこれを動作させることはできません。以下のコードは、Apacheサーバと思われる場合に接続するとうまくいきますが、.Netサーバに接続しようとするとエラーが発生します。私はそれがヘッダーの必要条件だと推測していますが、何を試してもここで成功を収めることはできないようです。HttpURLConnection java.io.FileNotFoundException

public String Download(String Url) 
{ 
String filepath=null; 
try { 
    //set the download URL, a url that points to a file on the internet 
    //this is the file to be downloaded 
    URL url = new URL(Url); 
    //create the new connection 
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

    //set up some things on the connection 
    urlConnection.setRequestMethod("GET"); 
    urlConnection.setDoOutput(true); 
    //and connect! 
    urlConnection.connect(); 
    //set the path where we want to save the file 
    //in this case, going to save it on the root directory of the sd card. 
    File SDCardRoot = Environment.getExternalStorageDirectory(); 
    //create a new file, specifying the path, and the filename 
    //which we want to save the file as. 

    String filename= "effortback.png"; // you can download to any type of file ex:.jpeg (image) ,.txt(text file),.mp3 (audio file) 
    Log.i("Local filename:",""+filename); 
    File file = new File(SDCardRoot + "/",filename); 

    //===================================== 
    if(file.createNewFile()) 
    { 
    file.createNewFile(); 
    } 
    //===================================== 

    //this will be used to write the downloaded data into the file we created 
    FileOutputStream fileOutput = new FileOutputStream(file); 

    //this will be used in reading the data from the internet 
    InputStream inputStream = urlConnection.getInputStream(); 

    //===================================== 
    //this is the total size of the file 
    int totalSize = urlConnection.getContentLength(); 
    //variable to store total downloaded bytes 
    int downloadedSize = 0; 
    //===================================== 

    //create a buffer... 
    byte[] buffer = new byte[2048]; 
    int bufferLength = 0; //used to store a temporary size of the buffer 

    //now, read through the input buffer and write the contents to the file 
    while ((bufferLength = inputStream.read(buffer)) > 0) { 
    //add the data in the buffer to the file in the file output stream (the file on the sd card 
    fileOutput.write(buffer, 0, bufferLength); 
    //add up the size so we know how much is downloaded 
    downloadedSize += bufferLength; 
    //this is where you would do something to report the prgress, like this maybe 
    Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; 

    } 
    //close the output stream when done 
    fileOutput.close(); 
    if(downloadedSize==totalSize) filepath=file.getPath(); 

//catch some possible errors... 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
    Log.i("URL-ERROR:",e.toString()); 
} catch (IOException e) { 
    filepath=null; 
    e.printStackTrace(); 
    Log.i("IO-ERROR:",e.toString()); 
} 
Log.i("filepath:"," "+filepath) ; 

return filepath; 

} 

エラーからの範囲:

java.io.FileNotFoundException //I always get this with either one of the below 
    org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1061) 

//or this one below 
libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionTmpl.java:186) 

は関係なく、私がしようとするものに思えません、私はそれを動作させることはできません。私はGoogleや他のサイトから画像をダウンロードしようとしていても、それはうまくいきます。私はここで何が欠けていますか?助けてください。それはデフォルトでtrueですので、あなたがに設定する必要があります

urlConnection.setDoOutput(false); 

注:

+0

[OK]をもう少し掘り下げて、サーバーから403エラーが発生しています。これはセキュリティ上のエラーですので、今私の質問はどのようにそれを過ぎていくのですか?前もって感謝します。 – nathan

+35

OK、わかりました。同じ問題を抱えている場合は、この行を使用しないことが非常に重要です。また、URLを確認してください。最初の問題は、URLのスペルが間違っていたため、サーバーから明らかな応答が得られました。私のURLを修正した後、まだ問題が残っていました。最終的には次の行です。urlConnection.setDoOutput(true);どうやら、JAVAのこの行は、HTTPプロトコルがGETを指定しているかどうかに関わらず、GETをPOSTに強制的に変更するようにしています。将来の人にとってはFYIだけです。 – nathan

+0

ありがとう、これは私を一日中忙しくさせています。 –

答えて

43

は同じ問題を抱えていたあなたが言ったように、解決しました。
に設定する必要があります。これは、VolleyHurlStackがtrueに設定されているためです。
は注意してください;)

EDIT: を私は、コードをチェックしましたし、@Abrahamフィリップが言ったように、デフォルトではfalseです。しかし、私がgetDoOutput()と呼ぶとtrueを返すので、私はそれをfalseに設定しなければならなかった。 VolleyHurlStackがtrueに設定されていました。だから、私の結論は、setDoOutputをfalseにするとうまくいくでしょう。お使いのサーバが> =HTTPStatus.BAD_REQUEST(400)を返した場合

package java.net; 
public abstract class URLConnection { 
... 

    /** 
    * Specifies whether this {@code URLConnection} allows sending data. 
    */ 
    protected boolean doOutput; 

... 
    public boolean getDoOutput() { 
     return doOutput; 
    } 

    public void setDoOutput(boolean newValue) { 
     checkNotConnected(); 
     this.doOutput = newValue; 
    } 
+1

あなたの声明は間違っているようです。 setDoOutputはデフォルトではfalseです。リファレンス(Java Docs):http://download.java。net/jdk7/archive/b123/docs/api/java/net/URLConnection.html#setDoOutput(boolean) –

+0

はい、そうですが、デフォルトではfalseです。私の更新をチェック;) – GuilhE

+0

downvoteが削除されました: –

88

あなたはHttpUrlConnection(およびOkHttpClient)からFileNotFoundExceptionを得ることができます。最初にステータスコードをチェックして、読み込む必要のあるストリームを確認する必要があります。非推奨

int status = connection.getResponseCode(); 

if(status >= HttpStatus.SC_BAD_REQUEST) 
    in = connection.getErrorStream(); 
else 
    in = connection.getInputStream(); 

はhttpStatus。最新の構文は次のようです:

  InputStream inputStream; 

      int status = urlConnection.getResponseCode(); 

      if (status != HttpURLConnection.HTTP_OK) 
       inputStream = urlConnection.getErrorStream(); 
      else 
       inputStream = urlConnection.getInputStream(); 
+3

素晴らしい!本当に役に立ちました –

+0

HttpStatusは廃止予定です。この回答は更新する必要があります。 –

+0

HttpURLConnection.HTTP_BAD_REQUESTを使用すると、HTTPStatus.BAD_REQUESTはAPIレベル22から廃止されます –

関連する問題