Pobieranie pliku .txt z URL

0

Cześć mam problem z pobraniem pliku URL. Mianowicie podczas próby czytania buforowanego strumienia danych zwraca on mi długość -1 czyli błąd. Z tego powodu nie mogę pobrać pliku. Poniżej wstawiam kod mojej klasy odpowiedzialnej za pobieranie. Czy ktoś wie jak poprawnie pobrać plik tekstowy ?


public class ScheduleDownloader extends AsyncTask<String, Void, Object> {
private static SSLContext sc;
URL url;
String nameOfFile = "";
private Activity act;

public ScheduleDownloader(Activity act, URL url, String nameOfFile) {
    this.act = act;
    this.url = url;
    this.nameOfFile = nameOfFile;
}

public void setURL(String url){
    try {
        this.url = new URL(url);
    }catch (MalformedURLException e){
        Log.d("urlError", e.toString());
    }
};
public void setNameOfFile(String nameOfFile) {
    this.nameOfFile = nameOfFile;
}

protected Object doInBackground(String... strings)  {
    Log.d("url", url.toString());
    try {
        downloadFile();
    }catch (Exception e){
        e.printStackTrace();
    }

    return null;
}
private String downloadFile() throws Exception {
        trustEveryone();
        URLConnection urlConnection =  url.openConnection();

        InputStream input = urlConnection.getInputStream();
        BufferedInputStream inStream = new BufferedInputStream(input, 1024 * 5);

        File file = new File(act.getDir("filesdir", Context.MODE_PRIVATE)+nameOfFile);
        if(file.exists()) file.delete();
        file.createNewFile();

        FileOutputStream output = new FileOutputStream(file);
        byte[] data = new byte[1024 * 5];
        int count = 0;
         while ( (count = inStream.read(data) ) != -1){
             Log.d("TAGin", count+"");
             output.write(data, 0, count);
         }
        Log.d("TAG", count+"");
        output.flush();
        output.close();
        input.close();

    return null;
}
private void trustEveryone() {
    TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}
                public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {};
                public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {};
            }
    };
    try {
        sc  = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}}
 

0

Podstawowe pytanie brzmi: Czy nadałeś odpowiednie prawa (<uses-permission android:name="android.permission.INTERNET" /> ) w manifeście? Bo bez tego kod się uruchomi, ale będziesz dostawał błędy przy próbie użycia.

0

Tak odpowiednie prawa dostępu są przyznane. Analizuje od dłuższego czasu to połączenie i mam następujące informacje. Podczas naciśnięcia przycisku "Download" zostaje uruchomiony javascript, który generuje link, a następnie wysyłane jest zapytanie GET. W nagłówku odpowiedzi pojawia się kod 302 i location do innego adresu czyli zostaje przekierowany do kolejnego podzapytania php. Tym razem w odpowiedzi dostaje Content-Type: application/ octet-stream i Content-disposition:attachment; filename=fb324bf29ab34dd038b8b4ae8f5fdafb.txt z tego co doczytałem taką odpowiedź ma wymusić na przeglądarce pobranie pliku, niestety moja aplikacja nie potrafi obsłużyć takiej sytuacji, czy ktoś ma jakiś pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1