2013-04-27 14 views
34

Obecnie używam kodu poniżej. Jestem nowy w tej funkcji, więc może to być po prostu coś prostego, ale wydaje mi się, że nie działa to na moim serwerze. Poniższy kod działa świetnie, jeśli łączę się z serwerami Apache, jednak gdy próbuję połączyć się z moim serwerem .Net, generuje błąd. Zgaduję, że jest to wymaganie nagłówka, ale nie mogę tu osiągnąć sukcesu bez względu na to, co próbuję.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; 

} 

Błędy wahają się od:

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) 

Wydaje bez względu na to, co staram, nie mogę zmusić go do pracy. Ponownie działa, jeśli próbuję pobrać obraz z Google lub niektórych innych witryn, nie wszystkie, ale zdecydowanie nie moje (. Net). Czego tu mi brakuje? Proszę pomóż.

+0

OK, trochę bardziej kopiąc i stwierdziłem, że otrzymuję błąd 403 z serwera. To jest błąd bezpieczeństwa, więc teraz moje pytanie brzmi: jak przejść przez to? Z góry dziękuję. – nathan

+35

OK, wymyśliłem to. Bardzo ważne, aby nie używać tej linii, jeśli masz ten sam problem, sprawdź także swój adres URL. Pierwszy problem polegał na tym, że mój adres URL został błędnie napisany, więc otrzymałem oczywistą odpowiedź od serwera. Po naprawieniu adresu URL nadal występowały problemy. Ostatecznie była to linia: urlConnection.setDoOutput (true); Podobno ta linia w JAVA zmusza protokół http do zmiany GET na POST, niezależnie od określenia GET. Tylko FYI, dla tych w przyszłości. – nathan

+0

DZIĘKUJEMY, że zajęło mi to cały dzień. –

Odpowiedz

43

miał ten sam problem, jak rozwiązać Mówiłeś:

urlConnection.setDoOutput(false); 

Zauważ, że musisz ustawić go fałszywego bo to prawda domyślnie.
Należy pamiętać, że należy ustawić wartość na false, ponieważ ustawienie VolleyHurlStack ustawiono na wartość true.
Zadbaj;)

EDIT: Właśnie sprawdziłem kod i domyślnie jest to fałszywy jak @Abraham Philip powiedział. Ale musiałem ustawić to na false, ponieważ jeśli zadzwoniłem pod numer getDoOutput(), powrócił on true. Zauważyłem, że VolleyHurlStack ustawił go na wartość true. Tak więc, moim wnioskiem jest, setDoOutput fałsz i będzie działać.

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

Twoje polecenie wydaje się nieprawidłowe. setDoOutput ma domyślnie wartość false. Dokumentacja (Java Docs): http: //download.java.net/jdk7/archive/b123/docs/api/java/net/URLConnection.html # setDoOutput (boolean) –

+0

Tak, masz rację, domyślnie jest to fałsz. Sprawdź moją aktualizację;) – GuilhE

+0

downvote removed :) –

88

Można uzyskać FileNotFoundException z HttpUrlConnection (i OkHttpClient) jeżeli serwer zwraca > =HTTPStatus.BAD_REQUEST (400). Najpierw sprawdź kod statusu, aby sprawdzić, który strumień chcesz przeczytać.

int status = connection.getResponseCode(); 

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

httpStatus przestarzała. Najnowsza składnia wydaje się być:

  InputStream inputStream; 

      int status = urlConnection.getResponseCode(); 

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

Świetnie! naprawdę pomocne –

+0

HttpStatus jest teraz przestarzałe. Ta odpowiedź musi zostać zaktualizowana. –

+0

używać HttpURLConnection.HTTP_BAD_REQUEST, HTTPStatus.BAD_REQUEST jest przestarzałe od poziomu interfejsu API 22 –

Powiązane problemy