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

Android, отправка фотографии на сервер

04.08.2016, 21:09. Просмотров 964. Ответов 12

Мне нужно отправить файл на сервер.
После выбора фотографии в галереи мы вызываем данный метод, которому передаем файл:
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
public static String uploadFile(File file) {
        PsychogolistAPI service = getRetrofit().create(PsychogolistAPI.class);
 
        RequestBody requestFile =
                RequestBody.create(MediaType.parse("multipart/form-data"), file);
 
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("picture", file.getName(), requestFile);
 
        String descriptionString = "image desctription";
 
        RequestBody description =
                RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
        Call<String> call = service.uploadFile(description, body);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call,
                                   Response<String> response) {
                if (response.isSuccessful()) {
                    Log.e("samuliak", "Succesful:" + response.body());
                } else
                    Log.e("samuliak", "not succesful > "+response.message());
                Log.e("samuliak", "body > :" + response.body());
            }
            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.e("samuliak", "Upload error:"+t.toString());
            }
        });
        Log.e("samuliak", "uploadFile. End.");
        return "Dsd";
    }
API ретрофита:
Java
1
2
3
4
@Multipart
    @POST("psychologist/upload")
    Call<String> uploadFile(@Part("description") RequestBody description,
                            @Part MultipartBody.Part file);
А вот так мы принимаем файл на сервере:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RequestMapping(value="/psychologist/upload", method=RequestMethod.POST)
    @ResponseBody
    public String uploadFile(@RequestParam("description") RequestBody description,
                             @RequestParam MultipartFile file){
        String path = "";
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                path = new File(description + "-uploaded").getPath();
                System.out.println(path);
                BufferedOutputStream stream =
                        new BufferedOutputStream(new FileOutputStream(new File(description + "-uploaded")));
                stream.write(bytes);
                stream.close();
            } catch (Exception e) {}
        }
        return path;
    }
Стектрейс логирование с ошибкой при запросе на сервер:
Java
1
2
3
4
5
6
7
8
9
10
08-04 13:58:02.041 24439-24439/com.project.samuliak.psychogram E/samuliak: Click!
08-04 13:58:03.778 24439-24439/com.project.samuliak.psychogram W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection
08-04 13:58:07.982 24439-24439/com.project.samuliak.psychogram E/samuliak: Activity result in Registr..
08-04 13:58:07.993 24439-24439/com.project.samuliak.psychogram E/samuliak: path from act.result > /storage/emulated/0/DCIM/Camera/IMG_20160624_141503.jpg
08-04 13:58:07.998 24439-24439/com.project.samuliak.psychogram E/samuliak: uploadFile. End.
08-04 13:58:08.671 24439-24478/com.project.samuliak.psychogram W/EGL_emulation: eglSurfaceAttrib not implemented
08-04 13:58:08.672 24439-24478/com.project.samuliak.psychogram W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xe2026ee0, error=EGL_SUCCESS
08-04 13:58:08.701 24439-24439/com.project.samuliak.psychogram I/Choreographer: Skipped 40 frames!  The application may be doing too much work on its main thread.
08-04 13:58:08.834 24439-24439/com.project.samuliak.psychogram E/samuliak: not succesful > Bad Request
08-04 13:58:08.834 24439-24439/com.project.samuliak.psychogram E/samuliak: body > :null
Я понимаю, что дело скорее всего в сервере, но не знаю как исправить. Делал по примерам из интернета (но по отдельности для андроида и для спринга). Возможно конфликт в файлах, которые передаю ..
Если кто то знает в чем проблема и как её исправить, буду очень благодарен! Очень прошу помощи!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2016, 21:09
Ответы с готовыми решениями:

Отправка данных из Android-приложения на сервер
Пишу приложения которое должно собирать кое какую инфу и отправлять её на...

Отправка массива данных из Android-приложения на сервер по протоколу HTTP
Пишу приложения которое должно собирать кое какую инфу и отправлять её на...

Можно ли написать веб сервер на Java для клиента на Android, имея под рукой только телефон на Android?
Уважаемые гуру программирования, если можно, пожалуйста, напишите поподробнее-...

Отправка E-Mail средствами Android
Можно ли отправить письмо на почту из андроид приложения, оминая...

C++ Qt и java Android отправка SMS
Здравствуйте. Уже пол года мучаю Qt увидел в настройках компиляцию под Android...

12
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
05.08.2016, 12:55 2
samuliak, покажите конфиг спринга и метод контроллера

Добавлено через 4 минуты
Размер файла какой?
0
samuliak
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
05.08.2016, 18:35  [ТС] 3
YuraAAA, вот WebConfig
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
@EnableWebMvc
@ComponentScan("com.samuliak.psychologist.server")
public class WebConfig extends WebMvcConfigurerAdapter{
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(new ObjectMapper());
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
 
        converters.add(converter);
    }
}
А вот DBConfig:
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
@Configuration
@EnableJpaRepositories("com.samuliak.psychologist.server.repository")
@EnableTransactionManagement
@PropertySource("classpath:db.properties")
@ComponentScan("com.samuliak.psychologist.server")
public class DBConfig {
 
    @Resource
    private Environment env;
 
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan(env.getRequiredProperty("db.entity.package"));
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        em.setJpaProperties(getHibernateProperties());
        return em;
    }
 
    @Bean
    public DataSource dataSource(){
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(env.getRequiredProperty("db.driver"));
        ds.setUrl(env.getRequiredProperty("db.url"));
        ds.setUsername(env.getRequiredProperty("db.username"));
        ds.setPassword(env.getRequiredProperty("db.password"));
 
        ds.setInitialSize(Integer.valueOf(env.getRequiredProperty("db.initialSize")));
        ds.setMinIdle(Integer.valueOf(env.getRequiredProperty("db.minIdle")));
        ds.setMaxIdle(Integer.parseInt(env.getRequiredProperty("db.maxIdle")));
        ds.setTimeBetweenEvictionRunsMillis(Long.valueOf(env.getRequiredProperty("db.timeBetweenEvictionRunsMillis")));
        ds.setMinEvictableIdleTimeMillis(Long.parseLong(env.getRequiredProperty("db.minEvictableIdleTimeMillis")));
        ds.setTestOnBorrow(Boolean.valueOf(env.getRequiredProperty("db.testOnBorrow")));
        ds.setValidationQuery(env.getRequiredProperty("db.validationQuery"));
 
        return ds;
    }
 
    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager manager = new JpaTransactionManager();
        manager.setEntityManagerFactory(entityManagerFactory().getObject());
 
        return manager;
    }
 
    public Properties getHibernateProperties() {
        try{
            Properties properties = new Properties();
            InputStream is = getClass().getClassLoader().getResourceAsStream("hibernate.properties");
            properties.load(is);
            return properties;
        } catch (IOException e ){
            throw  new IllegalArgumentException("Can`t find 'hibernate.properties' in classpath!");
        }
    }
}
Размер файла 7.4 кб (фотография сделанная на эмуляторе). Метод контроллера я был кинул в 1-м посте (над логами)
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,575
Завершенные тесты: 1
05.08.2016, 18:47 4
на сервере глотается исключение и ничего в консоль не выводится
0
samuliak
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
05.08.2016, 19:12  [ТС] 5
не знаю почему, но в консоль вообще ничего не выводится
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,575
Завершенные тесты: 1
05.08.2016, 19:13 6
я и говорю, что должно выводиться если там написано
Java
1
catch (Exception e) {}
0
samuliak
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
05.08.2016, 19:54  [ТС] 7
добавил e.printStackTrace, но все равно ничего не выводит .. или я не туда смотрю ..?
Теперь метод выглядит вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RequestMapping(value="/psychologist/upload", method=RequestMethod.POST)
    @ResponseBody
    public String uploadFile(@RequestParam("description") RequestBody description,
                             @RequestParam MultipartFile file){
        String path = "";
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                path = new File(description + "-uploaded").getPath();
                System.out.println(path);
                BufferedOutputStream stream =
                        new BufferedOutputStream(new FileOutputStream(new File(description + "-uploaded")));
                stream.write(bytes);
                stream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println("path > "+path);
        return path;
    }
В Tomcat Catalina Log появилась только такая строка:
Java
1
05-Aug-2016 19:51:20.207 INFO [RMI TCP Connection(5)-127.0.0.1] org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl.useContextualLobCreation HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Прикрепил так же скрин
0
Миниатюры
Android, отправка фотографии на сервер  
REALIST07
Автор FAQ
Автор FAQ
182 / 182 / 20
Регистрация: 11.06.2010
Сообщений: 949
05.08.2016, 22:05 8
Я никогда не использовал это api, и вообще не хочу показаться глупым, но кажется тут проблемы с рефлексией, а именно в модуле getHibernateProperties(), попробуйте добавить обычный catch с Exception,может поможет
0
samuliak
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
06.08.2016, 10:00  [ТС] 9
Он там присутствует, посмотрите в посте #3
0
REALIST07
Автор FAQ
Автор FAQ
182 / 182 / 20
Регистрация: 11.06.2010
Сообщений: 949
06.08.2016, 12:25 10
samuliak, я про обычный, там IO
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
06.08.2016, 13:57 11
samuliak, попробуйте в интерфейсе ретрофита сделать аргументы

Java
1
(@Part("description") RequestBody description, @Part("file"; filename="pp.png" ") RequestBody file) {
Добавлено через 1 минуту
samuliak, аргумент для файла будет
Java
1
RequestBody.create(MediaType.parse("image/*"), new File(filePath));
0
samuliak
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
06.08.2016, 19:43  [ТС] 12
YuraAAA, оно уже сорится при изменение параметров ретрофита. Прикрепляю скрин:
0
Миниатюры
Android, отправка фотографии на сервер  
samuliak
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 25
08.08.2016, 11:03  [ТС] 13
YuraAAA, может есть другие способы? Помогите пожалуйста
0
08.08.2016, 11:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2016, 11:03

Отправка Post запроса в Android предложении
Есть определенная php страница надо отправить на нее Post запрос из Android...

Отправка звонков на сервер
Всем привет подскажите как сделать приложение чтоб все входящие звонки...

Отправка данных на сервер
Нужна помощь. У меня кое-какие проблемы с кодом. Я отправляю данные на...


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

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

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