android - parametros - HttpURLConnection java.io.FileNotFoundException
httpurlconnection conn post (3)
Puede obtener una FileNotFoundException
de HttpUrlConnection
(y OkHttpClient
) si su servidor devuelve > = HTTPStatus.BAD_REQUEST
(400). Primero debe verificar el código de estado para verificar qué flujo debe leer.
int status = connection.getResponseCode();
if(status >= HttpStatus.SC_BAD_REQUEST)
in = connection.getErrorStream();
else
in = connection.getInputStream();
HttpStatus en desuso La última sintaxis parece ser:
InputStream inputStream;
int status = urlConnection.getResponseCode();
if (status != HttpURLConnection.HTTP_OK)
inputStream = urlConnection.getErrorStream();
else
inputStream = urlConnection.getInputStream();
Actualmente estoy usando el código a continuación. Soy nuevo en esta función, así que puede ser algo simple, pero parece que no puedo hacer que funcione con mi servidor. El siguiente código funciona muy bien si me conecto con servidores Apache, pero cuando trato de conectarme a mi servidor .Net arroja un error. Supongo que es un requisito de encabezado, pero parece que no puede tener éxito aquí sin importar lo que intento.
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;
}
Los errores van desde:
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)
Parece que no importa lo que intente, no puedo hacer que funcione. De nuevo, funciona si intento descargar una imagen de Google u otros sitios, no todos pero definitivamente no los míos (.Net). ¿Que me estoy perdiendo aqui? Por favor ayuda.
Tenía el mismo problema, resuelto como usted dijo:
urlConnection.setDoOutput(false);
Tenga en cuenta que debe establecerlo en falso porque es verdadero de manera predeterminada.
Tenga en cuenta que debe establecerlo en falso porque Volley
HurlStack
lo configuró en verdadero.
Cuídate ;)
EDITAR: Acabo de comprobar el código y, de forma predeterminada, es falso como dijo @Abraham Philip. Pero tuve que configurarlo en falso porque si llamaba a getDoOutput()
me estaba devolviendo true
. Descubrí que Volley
HurlStack
estaba estableciendo. Por lo tanto, mi conclusión es que setDoOutput
en falso y funcionará.
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;
}
FileNotFoundException
un problema, donde la ejecución de HEAD
-Request arrojó una FileNotFoundException
.
La razón es que una respuesta a un HEAD
no tiene un cuerpo y, por lo tanto, una llamada a getInputStream
arroja una FileNotFoundException
.
Entonces, si estás ejecutando un HEAD
, no deberías tratar de obtener el InputStream
.