Загрузка на Android - FileNotFoundException, но файл существует - PullRequest
3 голосов
/ 16 августа 2011

Я пытался загрузить файл с сервера в Android, но все, что я получил, это FileNotFoundException.

Мой метод загрузки отлично работает для всех файлов, которые я ему предоставляю, но не для этого конкретного URL. URL, на котором он не работает, выглядит следующим образом: http://server.com/download.aspx?action=geta&sid=12345&file=somedata.xml&client=android

Я не вижу ошибок в URL, если я ввожу его в веб-браузер, я немедленно получаю файл. С разрешениями тоже все в порядке, я могу использовать метод для загрузки любого другого файла с сервера, например, с помощью «getfile» вместо «get», но файл, который я хочу скачать, доступен только через «get», поэтому я могу не просто заменить его.

В любом случае, вот мой метод загрузки:

public String downloadURL (URL url, String fileName) throws IOException {
    String destination = null;

    try {           
        destination = Environment.getExternalStorageDirectory() + "/" 
                + "myapp/" + fileName;

        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(destination);

        byte buffer[] = new byte[1024];
        int bytes = 0;

        while ((bytes = input.read(buffer)) != -1) {
            output.write(buffer,0, bytes);
        }

        output.flush();
        output.close();
        input.close();

    }
    catch (Exception e) {
        Log.e("DOWNLOAD URL", "downloading file failed due to " + e.toString());
    }

    return destination; 
}

Я немного отчаялся, я некоторое время искал StackOverflow, но не нашел решения и был бы очень признателен за помощь.

РЕДАКТИРОВАТЬ: стек ошибок, если это то, что я думаю, это:

08-16 17: 32: 58.530: WARN / System.err (24754): java.io.FileNotFoundException: http://myfirm.com/download.aspx?action=get&sid=6d62429x-4e1c&file=data.xml&client=android 08-16 17: 32: 58.530: WARN / System.err (24754): на org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:532) 08-16 17: 32: 58.530: WARN / System.err (24754): на java.net.URL.openStream (URL.java:645) 08-16 17: 32: 58.530: WARN / System.err (24754): по адресу myapp.cont.fetch.Downloader.downloadURL (Downloader.java:412) 08-16 17: 32: 58.530: WARN / System.err (24754): на myapp.cont.fetch.Downloader.getData (Downloader.java:465) 08-16 17: 32: 58.530: WARN / System.err (24754): на myapp.cont.fetch.Downloader $ GetFilesTask.doInBackground (Downloader.java:245) 08-16 17: 32: 58.530: WARN / System.err (24754): на myapp.cont.fetch.Downloader $ GetFilesTask.doInBackground (Downloader.java:1) 08-16 17: 32: 58.530: WARN / System.err (24754): на android.os.AsyncTask $ 2.call (AsyncTask.java:252) 08-16 17: 32: 58.530: WARN / System.err (24754): в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) 08-16 17: 32: 58.530: WARN / System.err (24754): на java.util.concurrent.FutureTask.run (FutureTask.java:137) 08-16 17: 32: 58.530: WARN / System.err (24754): по адресу java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1081) 08-16 17: 32: 58.530: WARN / System.err (24754): по адресу java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:574) 08-16 17: 32: 58.530: WARN / System.err (24754): на java.lang.Thread.run (Thread.java:1020)

Ответы [ 3 ]

3 голосов
/ 16 августа 2011

Проблема с файлом назначения. Либо каталог myapp не существует на SDCard, либо вы не включили в свой manifest разрешение на запись на SD-карту:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2 голосов
/ 16 августа 2011

Трудно сказать без более точной информации, но я догадываюсь, что вам нужно создать свой локальный файл, прежде чем пытаться записать в него:

 File f = new File(Environment.getExternalStorageDirectory() + "/" 
            + "myapp/" + fileName);
 if(!f.exists()){
   f.createNewFile();
 }
 OutputStream output = new FileOutputStream(f);
0 голосов
/ 06 сентября 2017

создать соединение для объекта URL.HttpURLConnection conn = (HttpURLConnection) url.openConnection ();

, а затем считывает inputtream как conn.getInputStream ();

У меня была похожая проблема.Исправлено таким образом.

...