Получение файла с сервера
Получение файла с сервера
Доброе время суток:)
Спасибо за столь замечательный ресурс по разработке в Android:)
Возник один вопрос... понимаю что он наверное очень наивный и простой, но тем не менее не могу найти ответ.
Дело вот в чем:
Для работы своего приложения мне надо с удаленного сервера скачать файл, распаковать его, и записать данные в базу.
Проблема в общем то простая.... Как мне получить файл с сервера?
Подозреваю что надо воспользоваться запросом HTTP POST через HttpClient... но вот куда этот файл записывается и как к нему мне потом обратиться для последующей работы с ним...
Подскажите пожалуйста?
Спасибо за столь замечательный ресурс по разработке в Android:)
Возник один вопрос... понимаю что он наверное очень наивный и простой, но тем не менее не могу найти ответ.
Дело вот в чем:
Для работы своего приложения мне надо с удаленного сервера скачать файл, распаковать его, и записать данные в базу.
Проблема в общем то простая.... Как мне получить файл с сервера?
Подозреваю что надо воспользоваться запросом HTTP POST через HttpClient... но вот куда этот файл записывается и как к нему мне потом обратиться для последующей работы с ним...
Подскажите пожалуйста?
Re: Получение файла с сервера
Тут пример кода - http://stackoverflow.com/questions/2388 ... st-in-javatonic писал(а):Как мне получить файл с сервера?
Код: Выделить всё
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();
}
}
Re: Получение файла с сервера
Спасибо:)
Нашел немного другой пример, и на его основе попытался получить файл, но происходит ошибка и приложение закрывается:(
Запускал на эмуляторе.
Вот код:
А вот лог ошибок:
Помогите разобраться?
Заранее спасибо:)
Нашел немного другой пример, и на его основе попытался получить файл, но происходит ошибка и приложение закрывается:(
Запускал на эмуляторе.
Вот код:
Код: Выделить всё
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
Заранее спасибо:)
Re: Получение файла с сервера
Код рабочий, кроме сохранения:
Если хотите сохранять файл в Android во внутреннее хранилище (не SD), то надо делать так:
В секцию Uses в манифесте добавляли права на интернет?
Строка, возвращающая ошибку - SimpleSQLiteActivity.java:125. Что в ней написано?
Код: Выделить всё
FileOutputStream f = new FileOutputStream(new File("xmltv.xml.gz"));
Код: Выделить всё
FileOutputStream f = openFileOutput("xmltv.xml.gz",MODE_WORLD_READABLE);
Строка, возвращающая ошибку - SimpleSQLiteActivity.java:125. Что в ней написано?
Re: Получение файла с сервера
Разрешения добавлены
Строка, которая возвращает ошибку содержит:
До сохранения даже не доходит.
Код: Выделить всё
<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();
Re: Получение файла с сервера
А интернет работает?
проверьте доступ на интернет на эмуляторе может не настроена
проверьте доступ на интернет на эмуляторе может не настроена
Re: Получение файла с сервера
В самую первую очередь проверил:)BARS писал(а):BARS
Через браузер на эмуляторе нормально все открывает:((
Re: Получение файла с сервера
А текст ошибки какой?
Код, который я скинул, работает?
Код, который я скинул, работает?
Re: Получение файла с сервера
Вот текст ошибки:
"Произошла неожиданная остановка приложения SimpleSQLite (процесс ru.tonic.simpleSQL). Повторите попытку."
Версия Androin 3.1
Присланный вами код не проверял, т.к. пока не знаю как массив засунуть в файл:(
P.S. Подозреваю что вот так:
while ( (sz = in.read(buffer)) > 0 ) {
f.write(buffer,0, sz);
}
f.close();
Где buffer это массив полученный от вашей процедуры?
"Произошла неожиданная остановка приложения SimpleSQLite (процесс ru.tonic.simpleSQL). Повторите попытку."
Версия Androin 3.1
Присланный вами код не проверял, т.к. пока не знаю как массив засунуть в файл:(
P.S. Подозреваю что вот так:
while ( (sz = in.read(buffer)) > 0 ) {
f.write(buffer,0, sz);
}
f.close();
Где buffer это массив полученный от вашей процедуры?
Re: Получение файла с сервера
Похоже на правду. Если f - это FileOutputStream.tonic писал(а):Вот текст ошибки:
"Произошла неожиданная остановка приложения SimpleSQLite (процесс ru.tonic.simpleSQL). Повторите попытку."
Версия Androin 3.1
Присланный вами код не проверял, т.к. пока не знаю как массив засунуть в файл:(
P.S. Подозреваю что вот так:
while ( (sz = in.read(buffer)) > 0 ) {
f.write(buffer,0, sz);
}
f.close();
Где buffer это массив полученный от вашей процедуры?
Re: Получение файла с сервера
Запустил ваш код у себя, выдает туже самую ошибку, в логах ссылается на строку: int len = uc.getContentLength();
Уже все перепробовал что делать ума не приложу:((
Приложение валится с ошибкой и в эмуляторе и в рабочем девайсе....
Уже все перепробовал что делать ума не приложу:((
Приложение валится с ошибкой и в эмуляторе и в рабочем девайсе....
Re: Получение файла с сервера
Остается только усомниться в ссылке. Другие файлы пробовали так скачивать, с другого сервера?tonic писал(а):Запустил ваш код у себя, выдает туже самую ошибку, в логах ссылается на строку: int len = uc.getContentLength();
Уже все перепробовал что делать ума не приложу:((
Приложение валится с ошибкой и в эмуляторе и в рабочем девайсе....
А какой message возвращает Exception, если его ловить?
Re: Получение файла с сервера
ссылка 100% рабочая, т.к. я с нее скачивал.
Попробую другие ссылки, но что то сомневаюсь... Т.к. сама прога валится:
01-26 14:57:23.033: D/AndroidRuntime(393): Shutting down VM
Простите, а как его ловить?
Попробую другие ссылки, но что то сомневаюсь... Т.к. сама прога валится:
01-26 14:57:23.033: D/AndroidRuntime(393): Shutting down VM
Простите, а как его ловить?
Re: Получение файла с сервера
Через try-catchtonic писал(а):а как его ловить?
http://docs.oracle.com/javase/tutorial/ ... catch.html
Re: Получение файла с сервера
Пробовал нечто подобное сделать, приложение падает с NetworkOnMainThreadException (скорее всего у автора та же ошибка). Покопался, оказалось, что дело в том, что начиная с версии Honeycomb (источник: http://developer.android.com/reference/ ... ption.html) запрещено запускать удалённые http коннекты в основном потоке. Я заюзал AsyncTask, всё работает как надо.
Re: Получение файла с сервера
это утверждение звучит уже сотый раз на форуме))) просто матчасть нужно читать
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Получение файла с сервера
Да. Мистер Резак про это... не помню уже со счета сбился. Наверное 999999 раз писал. И код ошибки тоже говорит сам по себе. Для особо умныхrezak90 писал(а):это утверждение звучит уже сотый раз на форуме))) просто матчасть нужно читать
Re: Получение файла с сервера
для сведения.. тут много уроков, когда подобные неочевидные "сюрпризы" потом всплывают, что нужно многое переделывать..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
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198