it-swarm.com.de

HttpURLConnection Java.io.FileNotFoundException

Der folgende Code funktioniert gut, wenn ich eine Verbindung zu scheinbar Apache-Servern herstelle. Beim Versuch, eine Verbindung zu meinem .NET-Server herzustellen, wird jedoch ein Fehler ausgegeben. Ich vermute, es ist eine Header-Anforderung, aber ich kann anscheinend keine erfolgreiche Antwort erhalten, egal was ich versuche.

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)

Es scheint, dass, egal was ich versuche, ich es nicht zum Laufen bringen kann. Wieder funktioniert es, wenn ich versuche, ein Bild von Google oder anderen Websites herunterzuladen, aber nicht alle, aber definitiv nicht meine (.Net). Was fehlt mir hier? Bitte helfen.

39
nathan

Sie können eine FileNotFoundException von HttpUrlConnection (und OkHttpClient) erhalten, wenn Ihr Server> = HTTPStatus.BAD_REQUEST (400) zurückgibt. Sie sollten zuerst den Statuscode überprü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 ist 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();
96
Dori

Hatte das gleiche Problem, gelöst wie du gesagt hast: 

urlConnection.setDoOutput(false);

Beachten Sie, dass Sie es auf false setzen müssen, da es standardmäßig true ist.
Beachten Sie, dass Sie ihn auf false setzen müssen, da VolleyHurlStack auf true gesetzt ist.
Sich kümmern ;)

EDIT: Ich habe gerade den Code überprüft und ist standardmäßig falsch, wie @Abraham Philip sagte. Aber ich musste es auf false setzen, denn wenn ich getDoOutput() anrief, wurde true zurückgegeben. Ich habe festgestellt, dass VolleyHurlStack den Wert true hat. Meine Schlussfolgerung lautet also: setDoOutput zu false 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;
    }
48
GuilhE

Ich hatte ein Problem, bei dem die Ausführung einer HEAD- Anfrage eine FileNotFoundException warf.
Der Grund ist, dass eine Antwort auf eine HEAD keinen Körper hat und daher ein Aufruf an getInputStream eine FileNotFoundException wirft. 

Wenn Sie also eine HEAD ausführen, sollten Sie nicht versuchen, die InputStream zu erhalten.

0
Springrbua