Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
#1

Как лучше поступить с задачей сохранения картинки на сервере - Программирование Android

12.04.2014, 23:44. Просмотров 2115. Ответов 10
Метки нет (Все метки)

Такая дилемма.. Задача в том, чтобы получить картинку с камеры android-устройства и отправить ее на сервер, плюс еще кое-какие данные. Причем эти данные отправляются сразу же за картинкой и, вообще, они друг с другом взаимосвязаны. Данные на сервер передаем мы JSON'ом. Так вот я говорю, что картинку нужно передавать вместе с данными в JSON'е, "затолкав" в него массив байт data, который я получаю в методе

Java
1
public void onPictureTaken(byte[] data, Camera camera)
где data и есть само изображение. Но напарник мне говорит, что замучается потом конвертировать этот массив байт в изображение. Я его уверяю, что ему нужно просто сохранить этот массив в файловом потоке (я, кстати, не знаю, есть ли вообще такой в JS/PHP - серверной частью он занимается) с нужным расширением по указанному пути.

Он же мне предлагает: создать открытую папку на сервере и чтобы я ему напрямую сохранял это изображение с устройства в эту папку. А следом отправлять JSON с данными.

Как лучше поступить? Какой вариант "правильнее"? Или как-то по-другому лучше сделать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2014, 23:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как лучше поступить с задачей сохранения картинки на сервере (Программирование Android):

Как лучше поступить? - Программирование Android
Есть уже законченное приложение. Принцип которого вэб приложение, грузящее основную часть через инет. Но не суть - тут всё работает. Есть...

Определение веса и размера картинки (как лучше поступить) - PHP
Здравствуйте. Вопрос, возможно банальный, но для меня важен... В общем, как лучше поступить? - При загрузке картинки, имя картинки...

Как лучше поступить? - Оперативная память
Доброго времени суток. По непонятной причине вышел из строя один из двух таких модулей. Как лучше поступить: купить идентичный вышедшему...

Как лучше поступить? - MySQL
Есть активно работающая таблица с несколькими десятками тысяч записей. Только сейчас появилась потребность в том, чтобы каждая запись...

Как лучше поступить? - Апгрейд компьютера
Видеокарта GeForce GTX570 Процессор Intel Core i7 2600K Модуль памяти Kingston HyperX 4096Mb x2 Материнская плата ASUS P8H67 Блок...

Как лучше поступить? - Блоки питания
Доброго времени суток всем. Есть не совсем стандартный вопрос.. Имеем систему мать - Gigabyte GA-970A-UD3 Hdd - Hitaci 320gb и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
13.04.2014, 09:00 #2
Цитата Сообщение от Sony17 Посмотреть сообщение
Какой вариант "правильнее"?
Правильных вариантов не бывает... бывают простые в реализации или экономные для процессоров и трафика...
Самому скоро предстоит подобное, поэтому обдумывал эту идею давно...
Вариантов несколько!
1) передавать файлы напрямую или в архиве чрез PUSH PHP. На этом этапе можно сделать все что угодно. Даже авторизацию пользователя. Можно в архив запаковать рядом с фотками и текст в формате XML или JSON'е. Пока что я в своем проекте использую передачу архива на сторону сервера с последующей распаковкой там перед обработкой. Научился определять "поврежденность" архива. Планирую научиться поддерживать "докачку" для больших файлов (что-бы не передавать заново). Теоретически можно зашифровать передачу через https/SSL. Теоретически можно зашифровать архив (по умолчанию зип не поддерживает пароли ни на андроиде ни на PHP).
2) Написать свой протокол. Но нужно повесить сервер-слушатель, а PHP для этого не годится(Java, Pyton, C++). Бонус - любой порт, даже если злой админ закрыл фаерволом "однокласники". Далеко не для новичка! :-( Зато можно придумать свой метод шифрования.
3) Можно попробовать запаковать фотки в JSON, но УВЕРЕН будут проблемы. Причем с обоих сторон. Особенно на больших файлах (15 фоток по мегабайту и 2 строчки текстом). Да и не люблю я JSON/XML... Метаданные (скобки, названия полей) часто занимают в 2 раза больше чем текстовые данные... Но вроде прост (и быстр) благодаря "встроенности" в ОС андрода и в PHP. Не пробовал...
4) Открыть папку и просто складывать туда. Самый "дырявый" метод. Проще всего ломается. Что FTP, что виндовые папки.
5) Попробовать бесплатные облачные хранилища (DropBox, YandexDisk, GoogleDisk). Не пробовал, но теоретически должно сработать.

А как Вы на сегодня передаете текст в JSON-файлах? Каким методом?
0
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.04.2014, 11:10 #3
Sony17, то, что предлагает Вам напарник - самый плохой вариант.

Скачиваем либы:
commons-codec
commons-logging
fluent-hc
httpclient
httpclient-cache
httpcore
httpmime

Отправка файла:

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
private void postFile(){
        try{
             
            // the file to be posted
            String textFile = Environment.getExternalStorageDirectory() + "/sample.txt";
            Log.v(TAG, "textFile: " + textFile);
             
            // the URL where the file will be posted
            String postReceiverUrl = "http://yourdomain.com/post_data_receiver.php";
            Log.v(TAG, "postURL: " + postReceiverUrl);
             
            // new HttpClient
            HttpClient httpClient = new DefaultHttpClient();
             
            // post header
            HttpPost httpPost = new HttpPost(postReceiverUrl);
             
            File file = new File(textFile);
            FileBody fileBody = new FileBody(file);
     
            MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            reqEntity.addPart("file", fileBody);
            httpPost.setEntity(reqEntity);
             
            // execute HTTP post request
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity resEntity = response.getEntity();
     
            if (resEntity != null) {
                 
                String responseStr = EntityUtils.toString(resEntity).trim();
                Log.v(TAG, "Response: " +  responseStr);
                 
                // you can add an if statement here and do other actions based on the response
            }
             
        } catch (NullPointerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
post_data_receiver.php

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// if text data was posted
if($_POST){
    print_r($_POST);
}
 
// if a file was posted
else if($_FILES){
    $file = $_FILES['file'];
    $fileContents = file_get_contents($file["tmp_name"]);
    print_r($fileContents);
}
?>
В MultipartEntity можно запихивать всё что угодно.
1
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
13.04.2014, 14:33  [ТС] #4
Tester64,
>1) Была такая идея, только исп-ть POST запрос. Но зачем нужен доп. архив, если можно картинку вместе с данными "затолкать" в JSON?
>2) Пока что это излишества. К тому же, я с сетями мало знаком, а напарник не владеет ни одним из этих языков. Вот для саморазвития (а в этом главная цель проекта), после написания основного функционала, можно этим заняться. А сейчас главная задача: заставить все заработать.
>3) JSON побыстрее будет, как я понял. К тому же, я не файл с устройства собираюсь передавать, а массив байт, полученный в приведенном выше методе. Общий размер всех данных будет не велик.
>5) Это будет наш запасной вариант =)

Я только-только начал изучать JSON и пока знаю только единственный способ - методом put "заталкивать" все данные в него=)

Добавлено через 16 минут
YuraAAA,
За код огромное спасибо, но я не люблю исп-ть сторонние библиотеки =( Если вернуться к идеи: передавать все данные вместе с картинкой в JSON'е через POST запрос, не "потеряю" ли я чего? Или может это повлияет на трафик/зарядку или на что-либо другое? К тому же, я не файл с устройства буду загружать, а массив байт data, полученный в приведенном выше методе. Я же правильно думаю, что этот массив "формирует" картинку саму? И если я передам на сервер этот массив и, записав в потоке его в файл с соот. расширением, получим картинку?
0
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.04.2014, 15:07 #5
Sony17, у меня только один вопрос.
Цитата Сообщение от Sony17 Посмотреть сообщение
с картинкой в JSON'е через POST
как?
0
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
13.04.2014, 15:23  [ТС] #6
YuraAAA, после получения картинки с камеры (метод onPictureTaken(byte[] data, Camera camera)
) в JSON затолкать массив data (это и есть картинка, как я понял) вместе с ост. данными и отправить этот JSON на сервер POST запросом. А там дальше уже писать его в файл с соот. расширением, напр. на JAVA:

Java
1
2
3
FileOutputStream fos = new FileOutputStream(directory.imgPath()); 
                    fos.write(data);
                    fos.close();
Ну на PHP аналогичным образом.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
14.04.2014, 01:58 #7
Цитата Сообщение от YuraAAA Посмотреть сообщение
Скачиваем либы:
commons-codec
commons-logging
fluent-hc
httpclient
httpclient-cache
httpcore
httpmime
А зачем столько либ? И где качать?
У меня обычная отправка идет "из коробки". Небольшая процедурка...
0
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
14.04.2014, 10:33 #8
Tester64, это либы apache, позволяющие отправлять на сервер всё что угодно грубо говоря))
у неё есть такие чудесные вещи, как FileEntity, StringEntity, MultipartEntity.
В них можно запаковывать файлы и отправлять post/put запросами на сервер.
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
14.04.2014, 21:55 #9
Цитата Сообщение от YuraAAA Посмотреть сообщение
можно запаковывать файлы и отправлять post/put запросами на сервер
Особо с темой не "заморачивался". Нашел одно "проверенное" решение для отправки зипа на сервер чере пост и успокоился... Тонкости были не нужны (на этом этапе проекта) - лишь бы заработало... Вроде можно и строковые параметры в пост передавать (например имя/пароль для идентиикации пользователя). А что еще нужно? Причем все "из коробки"...
0
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
15.04.2014, 14:23 #10
Tester64, вот держите, может пригодится. Один метод, строящий post любых сложностей. Всё очень просто.

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
private MultipartEntity addMultiEntity(HashMap<String, Object> stringEntities, HashMap<String, File> fileEntities) {
        MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
        boolean isContentWasAddedTemp = false;
        //Create String multi-part entity
        if (stringEntities != null) {
            for (String key : stringEntities.keySet()) {
                Object value = stringEntities.get(key);
                if (value != null) {
                    try {
                        multipartEntity.addPart(key, new StringBody(value.toString()));
                        isContentWasAddedTemp = true;
                    } catch (UnsupportedEncodingException e) {
                        Log.e(TAG, e.toString());
                    }
                }
            }
        }
 
        //Create files multi-part entity
        if (fileEntities != null) {
            for (String key : fileEntities.keySet()) {
                File f = fileEntities.get(key);
                if (f != null) {
                    multipartEntity.addPart(key, new FileBody(f));
                    isContentWasAddedTemp = true;
                }
            }
        }
 
        return isContentWasAddedTemp ? multipartEntity : null;
    }
Передаёте туда Map из стрингов для паролей, имён и прочие. Map из файлов для файлов Можно передавать null вместо map, а также null внутри map.

а вот импорты:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
А вот метод, строящий GET

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
protected String buildUrl(String url, HashMap<String, Object> args) {
 
        if (args == null || args.isEmpty()) {
            return url;
        }
 
        //Check hashmap for contain notnull values
        boolean nullProtector = false;
        for (String key : args.keySet()) {
            if (args.get(key) != null) {
                nullProtector = true;
                break;
            }
        }
 
        if (!nullProtector) {
            return url;
        }
 
        if (!url.endsWith("?")) {
            url += "?";
        }
 
        List<NameValuePair> params = new LinkedList<NameValuePair>();
 
        for (String key : args.keySet()) {
            if (args.get(key) != null) {
                params.add(new BasicNameValuePair(key, args.get(key).toString()));
            }
        }
 
        String paramString = URLEncodedUtils.format(params, UTF_8);
 
        url += paramString;
        return url;
    }
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
15.04.2014, 21:14 #11
спасибо! добавил в коллекцию... потом разберусь!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2014, 21:14
Привет! Вот еще темы с ответами:

Как мне лучше поступить? - Базы данных
У меня есть таблица в .xls формате. Там около 8000 записей, причем эту таблицу будут периодически дополнять новыми записями и высылать мне....

Как лучше поступить с большой БД - MySQL
Имеется БД в которой есть 20 таблиц примерно по 100 000 записей в каждой. В каждой таблице есть по 20-25 полей. Есть 7 полей которые...

XML проектирование... и как лучше поступить. - XML/XSL
Проблема собственно вот в чем. Вот часть Log.XML: &lt;Root&gt; &lt;Login id=1&gt; &lt;Date val=&quot;01-01-06 &lt;IpAdr&gt;&lt;/IpAdr&gt; ...

Обновление комплектующих, как лучше поступить ? - Апгрейд компьютера
Всем привет. Я собрал теоретически будущую сборку для себя на Ситилинке, потому как там цены еще остались адекватные. Но потом нашел...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.04.2014, 21:14
Ответ Создать тему
Опции темы

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