2013-04-27 25 views
34

Ich verwende derzeit den folgenden Code. Ich bin neu in diesem Feature, so dass es einfach etwas einfaches sein kann, aber ich kann nicht scheinen, dass dies mit meinem Server funktioniert. Der folgende Code funktioniert gut, wenn ich eine Verbindung zu Apache-Servern herstelle, aber wenn ich versuche, eine Verbindung zu meinem .Net-Server herzustellen, wird ein Fehler ausgegeben. Ich vermute, es ist eine Header-Anforderung, aber kann nicht scheinen, hier Erfolg zu haben, egal was ich versuche.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; 

} 

Fehler reichen von:

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) 

egal scheint, was ich versuche, kann ich es nicht zu arbeiten. Wieder funktioniert es, wenn ich versuche, ein Bild von Google oder einigen anderen Seiten herunterzuladen, nicht alle, aber definitiv nicht meine (.Net). Was fehlt mir hier? Bitte helfen Sie.

+0

OK, habe ein wenig mehr graben und festgestellt, dass ich einen 403 Fehler vom Server bekomme. Dies ist ein Sicherheitsfehler, also ist meine Frage, wie komme ich daran vorbei? Danke im Voraus. – nathan

+35

OK, ich habe es herausgefunden. Sehr wichtig, diese Zeile nicht zu verwenden, wenn Sie das gleiche Problem haben, überprüfen Sie auch Ihre URL. Das erste Problem war, dass meine URL falsch geschrieben wurde, also bekam ich die offensichtliche Antwort vom Server. Nachdem ich meine URL repariert hatte, hatte sie immer noch Probleme. Letztendlich war es diese Zeile: urlConnection.setDoOutput (true); Anscheinend zwingt diese Zeile in JAVA das http-Protokoll dazu, ein GET zu einem POST zu ändern, ungeachtet der Angabe des GET. Nur ein FYI, für die in der Zukunft. – nathan

+0

DANKE, das hat mich einen ganzen Tag beschäftigt. –

Antwort

43

hatte das gleiche Problem, wie Sie gelöst sagte:

urlConnection.setDoOutput(false); 

Beachten Sie, dass es zu falsch setzen müssen, weil es standardmäßig wahr ist.
Beachten Sie, dass Sie es auf false festlegen müssen, weil VolleyHurlStack es auf True festgelegt hat.
Kümmern;)

EDIT: Ich habe gerade überprüft den Code und die standardmäßig falsch es ist, als sagte @Abraham Philip. Aber ich musste es auf false setzen, denn wenn ich getDoOutput() anrief, gab es true zurück. Ich habe festgestellt, dass VolleyHurlStack es auf wahr gesetzt hat. Also, meine Schlussfolgerung ist, setDoOutput falsch und es wird funktionieren.

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

Ihre Aussage scheint falsch zu sein. setDoOutput ist standardmäßig falsch. Referenz (Java-Dokumente): http: //download.java.net/jdk7/archiv/b123/docs/api/java/net/URLConnection.html # setDoOutput (boolean) –

+0

Ja, Sie haben Recht, standardmäßig ist es falsch. Überprüfe mein update;) – GuilhE

+0

downvote entfernt :) –

88

Sie können eine FileNotFoundException von HttpUrlConnection (und OkHttpClient) erhalten, wenn Ihr Server > =HTTPStatus.BAD_REQUEST (400) zurückgibt. Sie sollten zuerst den Statuscode prüfen, um zu prüfen, welchen Stream Sie lesen müssen.

int status = connection.getResponseCode(); 

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

Httpstatus als veraltet. Die neueste Syntax scheint zu sein:

  InputStream inputStream; 

      int status = urlConnection.getResponseCode(); 

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

Großartig! wirklich hilfreich –

+0

HttpStatus ist jetzt veraltet. Diese Antwort muss aktualisiert werden. –

+0

Verwenden Sie HttpURLConnection.HTTP_BAD_REQUEST, HTTPStatus.BAD_REQUEST ist veraltet von API-Ebene 22 –

Verwandte Themen