Получение файла с сервера

Ответить
tonic
Сообщения: 7
Зарегистрирован: 17 янв 2012, 22:40

Получение файла с сервера

Сообщение tonic » 17 янв 2012, 22:47

Доброе время суток:)
Спасибо за столь замечательный ресурс по разработке в Android:)
Возник один вопрос... понимаю что он наверное очень наивный и простой, но тем не менее не могу найти ответ.
Дело вот в чем:
Для работы своего приложения мне надо с удаленного сервера скачать файл, распаковать его, и записать данные в базу.
Проблема в общем то простая.... Как мне получить файл с сервера?
Подозреваю что надо воспользоваться запросом HTTP POST через HttpClient... но вот куда этот файл записывается и как к нему мне потом обратиться для последующей работы с ним...
Подскажите пожалуйста?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Получение файла с сервера

Сообщение damager82 » 18 янв 2012, 09:31

tonic писал(а):Как мне получить файл с сервера?
Тут пример кода - http://stackoverflow.com/questions/2388 ... st-in-java

Код: Выделить всё

public byte[] download(URL url) throws IOException {
    URLConnection uc = url.openConnection();
    int len = uc.getContentLength();
    InputStream is = new BufferedInputStream(uc.getInputStream());
    try {
        byte[] data = new byte[len];
        int offset = 0;
        while (offset < len) {
            int read = is.read(data, offset, data.length - offset);
            if (read < 0) {
                break;
            }
          offset += read;
        }
        if (offset < len) {
            throw new IOException(
                String.format("Read %d bytes; expected %d", offset, len));
        }
        return data;
    } finally {
        is.close();
    }
}
Метод вернет массив байтов и с ним уже можно работать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

tonic
Сообщения: 7
Зарегистрирован: 17 янв 2012, 22:40

Re: Получение файла с сервера

Сообщение tonic » 18 янв 2012, 12:45

Спасибо:)
Нашел немного другой пример, и на его основе попытался получить файл, но происходит ошибка и приложение закрывается:(
Запускал на эмуляторе.
Вот код:

Код: Выделить всё

Log.d(LOG_TAG, "--- download file: ---");
    	try {
			URL u = new URL("http://teleguide.info/download/new3/xmltv.xml.gz");

	        HttpURLConnection r = (HttpURLConnection) u.openConnection();
	        r.setRequestMethod("GET");
	        r.setDoOutput(true);
	        r.connect();
	        FileOutputStream f = new FileOutputStream(new File("xmltv.xml.gz"));
	
	        InputStream in = r.getInputStream();
	
	        byte[] buffer = new byte[1024];
	        int sz = 0;
	        while ( (sz = in.read(buffer)) > 0 ) {
	             f.write(buffer,0, sz);
	        }
	        f.close();
	        Log.d(LOG_TAG, "Download final");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Log.d("Erorr Download", "Error: " + e);
		}
А вот лог ошибок:

Код: Выделить всё

01-18 09:16:09.354: D/myLogs(399): --- download file: ---
01-18 09:22:23.522: D/AndroidRuntime(399): Shutting down VM
01-18 09:22:23.522: W/dalvikvm(399): threadid=1: thread exiting with uncaught exception (group=0x40014760)
01-18 09:22:23.642: E/AndroidRuntime(399): FATAL EXCEPTION: main
01-18 09:22:23.642: E/AndroidRuntime(399): android.os.NetworkOnMainThreadException
01-18 09:22:23.642: E/AndroidRuntime(399): 	at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at java.net.InetAddress.getAllByName(InetAddress.java:249)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:217)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at ru.tonic.simpleSQL.SimpleSQLiteActivity.onClick(SimpleSQLiteActivity.java:125)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at android.view.View.performClick(View.java:3110)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at android.view.View$PerformClick.run(View.java:11928)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at android.os.Handler.handleCallback(Handler.java:587)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at android.os.Handler.dispatchMessage(Handler.java:92)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at android.os.Looper.loop(Looper.java:132)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at android.app.ActivityThread.main(ActivityThread.java:4025)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at java.lang.reflect.Method.invoke(Method.java:491)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
01-18 09:22:23.642: E/AndroidRuntime(399): 	at dalvik.system.NativeStart.main(Native Method)
01-18 09:22:51.264: I/Process(399): Sending signal. PID: 399 SIG: 9
Помогите разобраться?
Заранее спасибо:)

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Получение файла с сервера

Сообщение damager82 » 18 янв 2012, 16:10

Код рабочий, кроме сохранения:

Код: Выделить всё

FileOutputStream f = new FileOutputStream(new File("xmltv.xml.gz"));
Если хотите сохранять файл в Android во внутреннее хранилище (не SD), то надо делать так:

Код: Выделить всё

FileOutputStream f = openFileOutput("xmltv.xml.gz",MODE_WORLD_READABLE);
В секцию Uses в манифесте добавляли права на интернет?
Строка, возвращающая ошибку - SimpleSQLiteActivity.java:125. Что в ней написано?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

tonic
Сообщения: 7
Зарегистрирован: 17 янв 2012, 22:40

Re: Получение файла с сервера

Сообщение tonic » 18 янв 2012, 17:14

Разрешения добавлены

Код: Выделить всё

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
Строка, которая возвращает ошибку содержит:

Код: Выделить всё

 r.connect();
До сохранения даже не доходит.

BARS
Сообщения: 3
Зарегистрирован: 19 янв 2012, 09:49

Re: Получение файла с сервера

Сообщение BARS » 19 янв 2012, 09:58

А интернет работает?
проверьте доступ на интернет на эмуляторе может не настроена

tonic
Сообщения: 7
Зарегистрирован: 17 янв 2012, 22:40

Re: Получение файла с сервера

Сообщение tonic » 19 янв 2012, 11:32

BARS писал(а):BARS
В самую первую очередь проверил:)
Через браузер на эмуляторе нормально все открывает:((

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Получение файла с сервера

Сообщение damager82 » 20 янв 2012, 14:22

А текст ошибки какой?

Код, который я скинул, работает?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

tonic
Сообщения: 7
Зарегистрирован: 17 янв 2012, 22:40

Re: Получение файла с сервера

Сообщение tonic » 20 янв 2012, 15:09

Вот текст ошибки:
"Произошла неожиданная остановка приложения SimpleSQLite (процесс ru.tonic.simpleSQL). Повторите попытку."
Версия Androin 3.1

Присланный вами код не проверял, т.к. пока не знаю как массив засунуть в файл:(

P.S. Подозреваю что вот так:
while ( (sz = in.read(buffer)) > 0 ) {
f.write(buffer,0, sz);
}
f.close();

Где buffer это массив полученный от вашей процедуры?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Получение файла с сервера

Сообщение damager82 » 25 янв 2012, 09:47

tonic писал(а):Вот текст ошибки:
"Произошла неожиданная остановка приложения SimpleSQLite (процесс ru.tonic.simpleSQL). Повторите попытку."
Версия Androin 3.1

Присланный вами код не проверял, т.к. пока не знаю как массив засунуть в файл:(

P.S. Подозреваю что вот так:
while ( (sz = in.read(buffer)) > 0 ) {
f.write(buffer,0, sz);
}
f.close();

Где buffer это массив полученный от вашей процедуры?
Похоже на правду. Если f - это FileOutputStream.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

tonic
Сообщения: 7
Зарегистрирован: 17 янв 2012, 22:40

Re: Получение файла с сервера

Сообщение tonic » 25 янв 2012, 16:02

Запустил ваш код у себя, выдает туже самую ошибку, в логах ссылается на строку: int len = uc.getContentLength();

Уже все перепробовал что делать ума не приложу:((
Приложение валится с ошибкой и в эмуляторе и в рабочем девайсе....

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Получение файла с сервера

Сообщение damager82 » 26 янв 2012, 14:31

tonic писал(а):Запустил ваш код у себя, выдает туже самую ошибку, в логах ссылается на строку: int len = uc.getContentLength();
Уже все перепробовал что делать ума не приложу:((
Приложение валится с ошибкой и в эмуляторе и в рабочем девайсе....
Остается только усомниться в ссылке. Другие файлы пробовали так скачивать, с другого сервера?

А какой message возвращает Exception, если его ловить?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

tonic
Сообщения: 7
Зарегистрирован: 17 янв 2012, 22:40

Re: Получение файла с сервера

Сообщение tonic » 26 янв 2012, 18:00

ссылка 100% рабочая, т.к. я с нее скачивал.
Попробую другие ссылки, но что то сомневаюсь... Т.к. сама прога валится:
01-26 14:57:23.033: D/AndroidRuntime(393): Shutting down VM
Простите, а как его ловить?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Получение файла с сервера

Сообщение damager82 » 28 янв 2012, 16:34

tonic писал(а):а как его ловить?
Через try-catch
http://docs.oracle.com/javase/tutorial/ ... catch.html
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Получение файла с сервера

Сообщение dens » 09 фев 2013, 18:04

Пробовал нечто подобное сделать, приложение падает с NetworkOnMainThreadException (скорее всего у автора та же ошибка). Покопался, оказалось, что дело в том, что начиная с версии Honeycomb (источник: http://developer.android.com/reference/ ... ption.html) запрещено запускать удалённые http коннекты в основном потоке. Я заюзал AsyncTask, всё работает как надо.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Получение файла с сервера

Сообщение rezak90 » 09 фев 2013, 20:13

это утверждение звучит уже сотый раз на форуме))) просто матчасть нужно читать
R.id.team
Политика на форуме запрещена

behzodbek
Сообщения: 58
Зарегистрирован: 23 дек 2012, 22:58
Откуда: UZB Namangan

Re: Получение файла с сервера

Сообщение behzodbek » 14 апр 2013, 20:40

rezak90 писал(а):это утверждение звучит уже сотый раз на форуме))) просто матчасть нужно читать
Да. Мистер Резак про это... не помню уже со счета сбился. Наверное 999999 раз писал. И код ошибки тоже говорит сам по себе. Для особо умных :)
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Получение файла с сервера

Сообщение Foenix » 15 апр 2013, 16:03

dens писал(а):Пробовал нечто подобное сделать, приложение падает с NetworkOnMainThreadException (скорее всего у автора та же ошибка). Покопался, оказалось, что дело в том, что начиная с версии Honeycomb (источник: http://developer.android.com/reference/ ... ption.html) запрещено запускать удалённые http коннекты в основном потоке. Я заюзал AsyncTask, всё работает как надо.
для сведения.. тут много уроков, когда подобные неочевидные "сюрпризы" потом всплывают, что нужно многое переделывать..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить