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.
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();
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 Volley
HurlStack
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 Volley
HurlStack
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;
}
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.