Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
1

Загрузка изображения

06.02.2017, 17:37. Просмотров 1918. Ответов 13
Метки нет (Все метки)

Здравствуйте уважаемые форумчане, столкнулся с такой бедой, дело в том, что на сервере лежит изображение в формате blob, написал когда для скачивания, но почему то после загрузки, если открыть изображения в галереи пишет, что нет миниатюры, никак не могу разобраться. Вот пример кода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@Override
        protected String doInBackground(String... parameters) {
            String idItem = parameters[0];
            String absoluteFileName = parameters[1];
            try {
                String urlString = Global.HTTP_DOWNLOAD;
                final URL downloadFileUrl = new URL(urlString);
                final HttpURLConnection connection = (HttpURLConnection) downloadFileUrl.openConnection();
                connection.setReadTimeout(Global.TIMEOUT);
                connection.setConnectTimeout(Global.TIMEOUT);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setRequestProperty("Authorization", "Basic " + Global.CREDENTIALS);
                connection.setRequestProperty("Accept-Charset", "UTF-8");
                String urlParams = "auth=" + Global.googleAccount + "&in_idOrderPhoto=" + idItem;
                Utils.log(urlString + "?" + urlParams);
                connection.setConnectTimeout(Global.TIMEOUT);
                connection.setReadTimeout(Global.TIMEOUT);
                connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParams.getBytes().length));
                DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
                dos.writeBytes(urlParams);
                dos.flush();
                dos.close();
 
                Utils.log("File file = new File(" + absoluteFileName + ");");
                File file = new File(absoluteFileName);
                file.createNewFile();
                if(file == null) {
                    Utils.log("file == null");
                }
                Utils.log("file != null");
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                if(fileOutputStream == null) {
                    Utils.log("fileOutputStream == null");
                }
                Utils.log("fileOutputStream != null");
                final byte buffer[] = new byte[2 * 1024];
                final InputStream inputStream = connection.getInputStream();
                int len = 0;
                int sum_len = 0;
 
                if(inputStream == null) {
                    Utils.log("inputStream == null");
                }
 
                Utils.log("inputStream != null");
                while ((len = inputStream.read(buffer)) > 0) {
                    fileOutputStream.write(buffer, 0, len);
                    Utils.log("len = " + len);
                    sum_len += len;
                }
                Utils.log("LEN = " + len);
                Utils.log("SUM LEN = " + sum_len);
                Utils.log("End While!");
                fileOutputStream.flush();
                fileOutputStream.close();
                inputStream.close();
            } catch (MalformedURLException e) {
                Utils.log(e.toString());
            } catch (IOException e) {
                Utils.log(e.toString());
            }
            return null;
        }
Но самое интересное, что если открывать файл на компьютере, то все отображается без каких либо проблем.
И еще одно, недавно узнал про класс Picasso и у меня возник такой вопрос, можно ли использовать ссылку для загрузки изображения вида: http://логин:пароль@название_сервера:порт/wh/xdb_clients.getOrderPhoto?auth=ylicesar12345@gmail.com&in_idOrderPhoto=4, после нескольких попыток, я перестал экспериментировать, с учетом того, то что в начале ссылки я написал логи и пароль для доступа к серваку.
З.Ы. В браузере изображения отображается корректно, как и на компьютере(уже скачанное)
З.Ы. Заранее спасибо
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2017, 17:37
Ответы с готовыми решениями:

Загрузка изображения
Привет всем, народ помогите пожалуйста, нужно загрузить изображения из произвольного место на...

Загрузка изображения
сейчас загружаю так BitmapFactory.decodeResource(context.getResources(), R.drawable.angle_ld) и...

Загрузка изображения с интернета
Всем привет! Стоит задача загружать картинку по ссылке в переменную Bitmap, написал следующий код:...

Загрузка изображения в imageview
Всем привет. Возникла проблема, распарсил сайт в arraylist, сохранил в БД, далее мне нужно вывести...

Загрузка изображения jpg.to
Есть такой сервис — jpg.to. Про ссылке любое_слово.jpg.to отдает изображение. Как загрузить это...

13
demixdn
312 / 256 / 80
Регистрация: 31.10.2016
Сообщений: 619
06.02.2017, 18:16 2
serSeventin, с Picasso можно использовать okhttp3, а в нем уже накидать нужных тебе параметров (Authorization, Accept-Charset и все остальное) и Picasso тогда будет загружать корректно. теоретически.
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
06.02.2017, 18:49  [ТС] 3
Спасибо, а как на счет моего кода и все проблемы в частности? У вас нет предположений?

Добавлено через 13 минут
И если не трудно, можно работу с классом okhttp3 на примере показать?
0
demixdn
312 / 256 / 80
Регистрация: 31.10.2016
Сообщений: 619
06.02.2017, 19:20 4
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
        okHttpBuilder.readTimeout(15, TimeUnit.SECONDS);
        okHttpBuilder.writeTimeout(15, TimeUnit.SECONDS);
        okHttpBuilder.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request original = chain.request();
 
                Request.Builder requestBuilder = original.newBuilder()
                        .addHeader("Authorization", "Basic +++")
                        .addHeader("Accept-Charset", "UTF-8")
                        .addHeader("Content-Length", "111");
                return chain.proceed(requestBuilder.build());
            }
        });
        OkHttpClient okHttpClient = okHttpBuilder.build();
        OkHttp3Downloader downloader = new OkHttp3Downloader(okHttpClient);
        final Picasso picasso = new Picasso.Builder(this).downloader(downloader).build();
        String imageUrl = "http://hosting/xdb_clients.getOrderPhoto?auth=ylicesar12345@gmail.com&in_idOrderPhoto=4";
        picasso.load(imageUrl)
                .into(new Target() {
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                        saveBitmap(bitmap, "path/somefile.png");
                    }
 
                    @Override
                    public void onBitmapFailed(Drawable errorDrawable) {
 
                    }
 
                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) {
 
                    }
                });
Только не совсем понял, куда у вас auth и in_idOrderPhoto, или в url, или в тело запроса. У меня в url добавлено.
Поэтому вам возможно нужно будет поправить код аналогично этому, примерно так
Java
1
2
3
MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
RequestBody body = RequestBody.create(mediaType, "auth= + <auth here> + &in_idOrderPhoto= + <idItem here>");
requestBuilder.post(body);
0
06.02.2017, 19:20
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
06.02.2017, 20:16  [ТС] 5
demixdn, первый вариант не сработал, пришлось перенести все в body:
Java
1
2
3
4
MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
                RequestBody body = RequestBody.create(mediaType,
                                                      "auth=" + Global.googleAccount +
                                                      "&in_idOrderPhoto=" + Global.all_items_buyer.get(position).getIdItem());
Но и этот вариант не работает, может у меня где-то ошибка?
0
demixdn
312 / 256 / 80
Регистрация: 31.10.2016
Сообщений: 619
06.02.2017, 20:32 6
serSeventin, я не знаю, что должно уходить на сервер, в каком формате. Что отнести к url, что к headers, а что к body.
Есть замечательная штука для тестирования таких дел - Postman, расширение для хрома. Поставьте, получите свою картинку через постман. А там еще есть кнопка "Code". Там выберите Java OK HTTP и будет почти готовый код к использованию. Со всеми headers и body.

Добавлено через 6 минут
и кстати, если вам нужно просто сохранить картинку, то пикассо вам не нужно. Просто выкачиваете через OkHttp поток байт и сохраняете в нужное место в памяти.

Добавлено через 3 минуты
https://github.com/square/okhttp/wiki/Recipes
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
06.02.2017, 21:24  [ТС] 7
Postman, почему то во время выполнения, это расширение зависает и ничего посмотреть нельзя, так и должно быть?
0
demixdn
312 / 256 / 80
Регистрация: 31.10.2016
Сообщений: 619
07.02.2017, 11:31 8
serSeventin, если плагин плохо работает, у них есть еще PС клиенты. Можете его скачать. Если постоянно работаете с сетью, классная штука, чтоб проверить, правильно ли сервер отдает данные.
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
07.02.2017, 14:05  [ТС] 9
Сервер отдает данные правильно, это программа проверила, но когда нужно вывести остальные данные о заголовка и теле, программа зависает, попробую программу на PC установить.

Добавлено через 1 час 10 минут
Проверил через программу на компьютере, выдала след. результат изображение, если я все правильно понял, это значит, что мне нужно добавить 4 заголовка, а тела нет?
0
demixdn
312 / 256 / 80
Регистрация: 31.10.2016
Сообщений: 619
07.02.2017, 14:11 10
serSeventin, нет, это headers ответа от сервера. Справа желтая кнопочка Code. Ее нажмите и там выберите java ok http, она сформирует код, который нужен.

Добавлено через 32 секунды
и удалите скриншот
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
07.02.2017, 14:46  [ТС] 11
Java
1
2
3
4
5
6
7
Request.Builder requestBuilder = original.newBuilder()
                        .header("Authorization", "Basic " + Global.CREDENTIALS)
                        .addHeader("Content-Type", "image/jpeg")
                        .addHeader("Server", "Oracle XML DB/Oracle Database")
                        .addHeader("Transfer-Encoding", "chunked")
                        .addHeader("Accept-Charset", "UTF-8")
                        .addHeader("Content-Length", Integer.toString(urlImage.getBytes().length));
С этим кодом много экспериментировал и получил следующие результаты, если всего один заголовок с авторизацией, то вызываются функции onBitmapFailed и onPrepareLoad, а если использовать разные заголовки, то вызывается только функция onPrepareLoad, получается мне кажется возможно почему то на телефон подгружаются битые файлы, но хочу заметить, что на компьютере они открываются, а на телефоне пишет, нет миниатюры, хотя иконка с описанием есть, я вижу свой изображение, пытаюсь открыть, а оно пишет нет миниатюры, я в замешательстве не знаю что делать, у кого была такая проблема, отзовитесь пожалуйста.

Добавлено через 15 минут
demixdn, сделал все как ты сказал, но все равно вызываются две функции onBitmapFailed и onPrepareLoad, скорее всего битые изображения, у меня нет больше предположений.
0
demixdn
312 / 256 / 80
Регистрация: 31.10.2016
Сообщений: 619
07.02.2017, 14:49 12
serSeventin, попробуйте без пикассо, просто поток байт записать на диск. ведь картинка, это прежде всего байты. и потом попробовать открыть как картинку.
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
07.02.2017, 22:28  [ТС] 13
Я так и делал, до пикассо, но в том то и проблема, что на телефоне изображение не открывается, пишет нет миниатюры, а на компьютере, это же изображение открывается и я не могу понять, что такое происходит.

Добавлено через 7 часов 18 минут
Еще хотелось бы отметить, что данные изображения хранятся в формате blob, может как-то это влияет на отображения изображения на телефоне?
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
07.02.2017, 23:21  [ТС] 14
Обрисую ситуацию заново.
Пользователь фотографирует изображение и пересылает его серверу, на сервер изображение храниться в формате blob, после этого пользователь может скачать изображение с сервера и просмотреть на телефоне, но дело в том, что алгоритм скачивания работает некорректно и при открытии изображения на телефоне, пишет что нет миниатюры. Почему я не знаю, т.к. если же это изображение открыть на компьютере, то оно отображается без проблем. Функция загрузки изображения приведена внизу.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
protected String doInBackground(String... parameters) {
            String idItem = parameters[0];
            String absoluteFileName = parameters[1];
            try {
                String urlString = Global.HTTP_DOWNLOAD;
                final URL downloadFileUrl = new URL(urlString);
                final HttpURLConnection connection = (HttpURLConnection) downloadFileUrl.openConnection();
                connection.setReadTimeout(Global.TIMEOUT);
                connection.setConnectTimeout(Global.TIMEOUT);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setRequestProperty("Authorization", "Basic " + Global.CREDENTIALS);
                connection.setRequestProperty("Accept-Charset", "UTF-8");
                String urlParams = "auth=" + Global.googleAccount + "&in_idOrderPhoto=" + idItem;
                Utils.log(urlString + "?" + urlParams);
                connection.setConnectTimeout(Global.TIMEOUT);
                connection.setReadTimeout(Global.TIMEOUT);
                connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParams.getBytes().length));
                DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
                dos.writeBytes(urlParams);
                dos.flush();
                dos.close();
 
                File file = new File(absoluteFileName);
                file.createNewFile();
 
                FileOutputStream fileOutputStream = new FileOutputStream(file);
 
                final byte buffer[] = new byte[2 * 1024];
                final InputStream inputStream = connection.getInputStream();
 
                Utils.log("inputStream != null");
                while ((len = inputStream.read(buffer)) > 0) {
                    fileOutputStream.write(buffer, 0, len);
                }
 
                fileOutputStream.flush();
                fileOutputStream.close();
                inputStream.close();
            } catch (MalformedURLException e) {
                Utils.log(e.toString());
            } catch (IOException e) {
                Utils.log(e.toString());
            }
            return null;
        }
Кто-нибудь может объяснить, что происходит.
0
07.02.2017, 23:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2017, 23:21

Загрузка изображения и рисование
Здравствуйте, подскажите пожалуйста, я могу загрузить фото из интернета, но не знаю как на нем...

Загрузка изображения из интернета в imageview
Доброго, передаю из одной активити в другую ссылку на картинку, она прямая, как мне ее вывести в...

RecyclerView.Adapter загрузка изображения
При прокрутке RecycleView в ImageView загружается необходимая фотография.. Но при прокрутке почему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.