Arhn - архитектура программирования

Загрузка файла модификации, объекты на стороне сервера недействительны

Я хочу отправить фотографию из локальной галереи Android на сервер http Tomcat. Для связи я использую модификацию. Я установил соединение между устройством и сервером, и программа входит в функцию сервера, но все объекты в параметрах равны нулю.

Это объявление функции устройства на стороне клиента:

@Multipart
@POST("/monument/photo/upload")
void addMonumentPhoto(@Part("MonumentID") Integer monumentId,
                      @Part("name") String name,
                      @Part("subscript") String subscript,
                      @Part("photo") TypedFile photo,
                      Callback<Photo> callback);

... и вот как я это называю:

photo = _resizePhoto(new File(monument.getUriZdjecie()));
typedFile = new TypedFile("multipart/mixed", photo);
//long bytes = photo.length();

  if (photo.exists()) {
      MonumentsUtil.getApi().addMonumentPhoto(monument.getIdZabytek(),
          "podpis",
          "Main photo",
           typedFile,
           new Callback<Photo>() {
           @Override
           public void success(Photo aPhoto, Response response) {

                  monument.setUriZdjecie(aPhoto.getUri());

                  MonumentsUtil.getApi().addMonument(monument.getNazwa(),
                                            monument.getOpis(),
                                            monument.getDataPowstania(),
                                            monument.getWojewodztwo(),
                                            monument.getUriZdjecie(),
                                            monument.getMiejscowosc(),
                                            monument.getKodPocztowy(),
                                            monument.getUlica(),
                                            monument.getNrDomu(),
                                            monument.getNrLokalu(),
                                            monument.getKategoria(),
                                            monument.getLatitude(),
                                            monument.getLongitude(),
                                            new MonumentsCallback());
           }
           @Override
           public void failure(RetrofitError retrofitError) {
                 Log.e(TAG, retrofitError.getMessage());
           }
     });
}

и метод сервера:

@RequestMapping(value = "/monument/photo/upload")
public
@ResponseBody
Photo requestMonumentPhotoAdd(@RequestParam(value = "MonumentID", required = false) Integer monumentId,
                              @RequestParam(value = "name", required = false) String name,
                              @RequestParam(value = "subscript", required = false) String subscript,
                              @RequestParam(value = "photo", required = false) MultipartFile file,
                              HttpServletRequest request) {

    Photo photo = new Photo();
    if (monumentId != null)
        photo.setIdZabytek(monumentId);
    photo.setUri(URL + "/images/" + name);
    photo.setPodpis(subscript);
    photo = monumentsRepo.addPhoto(photo);
    String filePath = "D:\\Projects\\Images\\" + monumentId + "_" + photo.getIdZjecia();

    if (file != null) {
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream =
                        new BufferedOutputStream(new FileOutputStream(new File(filePath)));
                stream.write(bytes);
                stream.close();
                photo.setUri(filePath);
                monumentsRepo.updatePhoto(photo);
                return photo;
            } catch (Exception e) {
                return null;
            }
        } else {
            return null;
        }
    }
    else {
        return null;
    }
}

Может ли кто-нибудь помочь мне и объяснить, почему все объекты после входа в метод сервера являются нулевыми? Возможно, неправильно написан метод или неправильно выбрано поле mime TypedFile, но я читал, что тип mime «multipart/mixed» предназначен для сообщений с различными типами объектов, включенных в сообщение. Я понятия не имею, так что любой совет будет полезен.


  • у меня такая же проблема... не могли бы вы поделиться решением, если вы его уже знаете? Благодарность! 07.02.2014
  • Вы должны перейти по этой ссылке, чтобы Загрузить фото 07.10.2015

Ответы:


1

Попробуйте при создании объекта TypedFile использовать «image/*» в качестве типа mime. Для этой «части» она относится к этому конкретному типу. «Смешанный», скорее всего, относится к отправке в целом, а не к отдельной части файла.

typedFile = new TypedFile("image/*", photo);

08.01.2014

2

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

Чтобы загрузить изображение, вам необходимо правильно создать API, а также правильно передать изображение.

Это должно хорошо работать для вас:

В клиенте Retrofit вам необходимо настроить образ следующим образом:

String photoName = "20150219_222813.jpg";
File photo = new File(photoName );
TypedFile typedImage = new TypedFile("application/octet-stream", photo);


RetrofitClient.uploadImage(typedImage, new retrofit.Callback<Photo>() {

            @Override
            public void success(Photo photo, Response response) {
                Log.d("SUCCESS ", "SUCCESS RETURN " + response);
            }

            @Override
            public void failure(RetrofitError error) {

            }
        });

НАСТРОЙКА API:

@Multipart
@POST("/")
void uploadImage(@Part("file") TypedFile file, Callback<Photo> callback);

PHP-код на стороне удаленного сервера для обработки изображения:

........
$pic = 'uploaded_images/' . $imagename . '.jpg';
if (!move_uploaded_file($_FILES['file']['tmp_name'], $pic)) {
   echo "posted";
}
.........

Если это кому-то поможет, пожалуйста, узнайте меня .. большое спасибо ..

04.03.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..