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.
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
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
DANKE, das hat mich einen ganzen Tag beschäftigt. –