Загрузить приложение / октет-стрим (изображение JPG - Spring Multipart post Request) - PullRequest
0 голосов

Я пытаюсь сохранить изображения (jpg) на моем сервере через мобильное приложение.

Я снимаю изображение с помощью ионной камеры (CameraPreview) и передаю его вОбратный сервис (Spring) через почтовый http метод.

Проблема в формате.Изображения сохраняются правильно, но без какого-либо формата .

Это код камеры для съемки :

 takePicture() {
    this.cameraPreview.takePicture(this.pictureOpts).then((imageData) => {
     this.selectedImage = 'data:image/jpeg;base64,' + imageData;
      this.globalDataService.changePictureTaken(this.selectedImage);
      this.location.back();
    }, (err) => {
      console.log(err);
      this.selectedImage = 'assets/img/test.jpg';
    });
  }

это код, который отправляет изображение на сервер :

uploadImageService(url: string, param: any) {
    const fd: FormData = new FormData();
    const imgBlob = new Blob([param],{type: param.type});
    fd.append('file', imgBlob);
     return this.http
       .post(url, fd, httpOptionsImages);
  }

Это код на стороне сервера:

 @RequestMapping(method = RequestMethod.POST, value = "/subir-imagen")
    public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException, SQLException {
        LOGGER.log(Level.INFO, "/subir-imagen, handleFileUpload file.tostring {0}", file.toString());
 String fileName = fileManagerService.storeFile(file);
 String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
                .path("/downloadFile/")
                .path(fileName)
                .toUriString()
        return ResponseEntity.ok(fileDownloadUri);
}

public String storeFile(MultipartFile file) throws SQLException, IOException {
        // Normalize file name
        String fileName = StringUtils.cleanPath(file.getName());
        try {
            // Check if the file's name contains invalid characters
            if (fileName.contains("..")) {
                LOGGER.log(Level.INFO, "Sorry! Filename contains invalid path sequence {0}", fileName);
            }
            String extension = FilenameUtils.getExtension(file.getOriginalFilename());
            Path path = Paths.get(fileStoragePath + File.separator + fileName + "." + extension.toLowerCase());
            Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
       } 
       catch (IOException ex) {
            LOGGER.log(Level.INFO, "Could not store file " + fileName + ". Please try again! {0}", ex);
       }
    return fileName;
}

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

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

КогдаЯ запускаю на стороне сервера file.getContentType()); Я видел, что изображение, отправленное моим приложением, имеет тип application / octet-stream , а изображение, отправленное почтальоном, - image / jpg

Я пытался преобразовать приложение / октет-поток в изображение / JPG без успеха в Java.Также я пытался поставить Content-Type заголовки к запросу, но у меня есть только некоторые ошибки ...

Я также пытался пропустить изображение непосредственно через форму, без BLOB-объектов, а также без BLOB-объектовили форма, и она все еще не работает.

Есть ли способ, когда вы копируете файл, вы передаете его в конкретную форму?или любой способ отформатировать это изображение с ионной камеры?

Спасибо!

1 Ответ

0 голосов
/ 13 мая 2019

Может быть, здесь есть два отдельных вопроса.Возвращаются данные изображения в формате в кодировке base64 JPEG, что подходит для просмотра в Интернете, когда к ним добавляется data:image/jpeg;base64,.Но обычные программы просмотра изображений (и большинство других приложений) ожидают двоичный файл JPEG (без кодировки base64) и без добавленного тега data:image.

Мы можем проверить, открыв файл на сервере(с помощью шестнадцатеричного или текстового редактора), чтобы увидеть, если он закодирован в base64.Бинарный JPEG может быть идентифицирован по наличию строки 'JFIF' в начале файла.

Если это так, первое, что нужно сделать, это преобразовать изображение base64 в двоичный формат (без 'data: image)') перед отправкой на сервер.Или мы также можем конвертировать на стороне сервера.В Javascript есть функция atob(), а на сервере Java 8 имеет библиотеку Base64.Также есть кодер / декодер (кодек) от Apache Commons.

Расширение файла можно решить, указав полное имя файла в fd.append().

...