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óż.
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
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
DZIĘKUJEMY, że zajęło mi to cały dzień. –